I am using Spring Data JPA
and Spring Boot
. The layout of the application is this
main
+-- java
+-- com/lapots/game/monolith
+-- repository/relational
+--RelationalPlayerRepository.java
+-- web
+--GrandJourneyMonolithApplication.java
+-- config
+-- RelationalDBConfiguration.java
test
+-- java
+-- com/lapots/game/monolith
+-- repository/relational
+-- RelationalPlayerRepositoryTests.java
+-- web
+-- GrandJourneyMonolithApplicationTests.java
The repository for my object looks like this
public interface RelationalPlayerRepository extends JpaRepository<Player, Long> {
}
Additionally for the repositories I provided a configuration
@Configuration
@EnableJpaRepositories(basePackages = "com.lapots.game.monolith.repository.relational")
@EntityScan("com.lapots.game.monolith.domain")
public class RelationalDBConfiguration {
}
My main application looks like this
@SpringBootApplication
@ComponentScan("com.lapots.game.monolith")
public class GrandJourneyMonolithApplication {
@Autowired
private RelationalPlayerRepository relationalPlayerRepository;
public static void main(String[] args) {
SpringApplication.run(GrandJourneyMonolithApplication.class, args);
}
@Bean
public CommandLineRunner initPlayers() {
return (args) -> {
Player p = new Player();
p.setLevel(10);
p.setName("Master1909");
p.setClazz("warrior");
relationalPlayerRepository.save(p);
};
}
}
Test for application looks like this
@RunWith(SpringRunner.class)
@SpringBootTest
public class GrandJourneyMonolithApplicationTests {
@Test
public void contextLoads() {
}
}
The test for repository looks like this
@RunWith(SpringRunner.class)
@DataJpaTest
public class RelationalPlayerRepositoryTests {
@Autowired
private TestEntityManager entityManager;
@Autowired
private RelationalPlayerRepository repository;
@Test
public void testBasic() {
Player expected = createPlayer("Master12", "warrior", 10);
this.entityManager.persist(expected);
List<Player> players = repository.findAll();
assertThat(repository.findAll()).isNotEmpty();
assertEquals(expected, players.get(0));
}
private Player createPlayer(String name, String clazz, int level) {
Player p = new Player();
p.setId(1L);
p.setName(name);
p.setClazz(clazz);
p.setLevel(level);
return p;
}
}
But when I try to run the tests I get the error
Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 0.041 sec <<< FAILURE! - in com.lapots.game.monolith.repository.relational.RelationalPlayerRepositoryTests
initializationError(com.lapots.game.monolith.repository.relational.RelationalPlayerRepositoryTests) Time elapsed: 0.006 sec <<< ERROR!
java.lang.IllegalStateException: Unable to find a @SpringBootConfiguration, you need to use @ContextConfiguration or @SpringBootTest(classes=...) with your test
at org.springframework.util.Assert.state(Assert.java:70)
at org.springframework.boot.test.context.SpringBootTestContextBootstrapper.getOrFindConfigurationClasses(SpringBootTestContextBootstrapper.java:202)
at org.springframework.boot.test.context.SpringBootTestContextBootstrapper.processMergedContextConfiguration(SpringBootTestContextBootstrapper.java:137)
at org.springframework.test.context.support.AbstractTestContextBootstrapper.buildMergedContextConfiguration(AbstractTestContextBootstrapper.java:409)
at org.springframework.test.context.support.AbstractTestContextBootstrapper.buildDefaultMergedContextConfiguration(AbstractTestContextBootstrapper.java:323)
at org.springframework.test.context.support.AbstractTestContextBootstrapper.buildMergedContextConfiguration(AbstractTestContextBootstrapper.java:277)
at org.springframework.test.context.support.AbstractTestContextBootstrapper.buildTestContext(AbstractTestContextBootstrapper.java:112)
at org.springframework.boot.test.context.SpringBootTestContextBootstrapper.buildTestContext(SpringBootTestContextBootstrapper.java:82)
at org.springframework.test.context.TestContextManager.<init>(TestContextManager.java:120)
at org.springframework.test.context.TestContextManager.<init>(TestContextManager.java:105)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTestContextManager(SpringJUnit4ClassRunner.java:152)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.<init>(SpringJUnit4ClassRunner.java:143)
at org.springframework.test.context.junit4.SpringRunner.<init>(SpringRunner.java:49)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:104)
at org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:86)
at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59)
at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:26)
at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59)
at org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:33)
at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:283)
at org.apache.maven.surefire.junit4.JUnit4Provider.executeWithRerun(JUnit4Provider.java:173)
at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:153)
at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:128)
at org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:203)
at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:155)
at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:103)
What is the problem?
Domain Player
loooks like this
@Data
@Entity
@Table(schema = "app", name = "players")
public class Player {
@Id
@GeneratedValue
private Long id;
@Transient
Set<Player> comrades;
@Column(unique = true)
private String name;
private int level;
@Column(name = "class")
private String clazz;
}
src/test/java
packages and src/main/java
packages should match.
I had same issue where
src/main/java
packages were starting with com.comp.example butsrc/test/java
packages were starting with com.sample.example
Because of this spring boot application was not able to pickup the configuration of the application, which it picks up from @SpringBootApplication
class.
So test case should fall under the same packages where @SpringBootApplication
in src/main/java
is written.
When the Spring Boot starts, it scans the classpath from the top to the bottom of the project to find the config file. Your config is under another files and that is a reason of the problem. Move you config upper to the monolith package and everything gonna be fine.
@SpringBootTest
has a parameter named classes
. It accepts an array of classes for configuration. Add the class for the config file to it, for example:
@SpringBootTest(classes={com.lapots.game.monolith.web.GrandJourneyMonolithApplication.class})
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With