J'utilise Spring Data JPA
et Spring Boot
. La mise en page de l'application est la suivante
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
Le référentiel de mon objet ressemble à ceci
public interface RelationalPlayerRepository extends JpaRepository<Player, Long> {
}
De plus, pour les référentiels, j'ai fourni une configuration
@Configuration
@EnableJpaRepositories(basePackages = "com.lapots.game.monolith.repository.relational")
@EntityScan("com.lapots.game.monolith.domain")
public class RelationalDBConfiguration {
}
Mon application principale ressemble à ceci
@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 d'application ressemble à ceci
@RunWith(SpringRunner.class)
@SpringBootTest
public class GrandJourneyMonolithApplicationTests {
@Test
public void contextLoads() {
}
}
Le test pour le référentiel ressemble à ceci
@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;
}
}
Mais quand j'essaye de faire les tests, j'obtiens l'erreur
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)
Quel est le problème? Domaine Player
loooks comme ceci
@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;
}
Lorsque SpringBoot démarre, il analyse le chemin de classe de haut en bas du projet pour rechercher le fichier de configuration. Votre configuration se trouve dans un autre fichier et c’est la raison du problème. Déplacez votre configuration supérieure vers le package monolith et tout ira bien
Les packages src/test/Java
et les packages src/main/Java
doivent correspondre. J'ai eu le même problème: mes packages src/main/Java
commençaient par com.comp.example mais les packages src/test/Java
commençaient par com.sample.example . En raison de cette initialisation printanière, l'application n'a pas été en mesure de récupérer la configuration de l'application à partir de la classe @SpringBootApplication
. Ainsi, le scénario de test doit figurer dans les packages où @SpringBootApplication
dans src/main/Java
est écrit.
J'utilise Spring Boot avec un simple contrôleur REST. N'utilisant aucune JPA et obtenant la même erreur que celle spécifiée dans le titre ici pour mon test de contrôleur. De plus, j'utilise une configuration personnalisée pour mon application de démarrage Spring. La deuxième réponse ci-dessus (réponse du 19 octobre 18h à 19h20, Saurabh Parmar) a aidé. La cause fondamentale pour moi aussi était le nom du paquet. Le package de mon test sous src/test/Java ne correspond pas à celui de src/main/Java. Une fois que j'ai résolu que cela fonctionnait.