web-dev-qa-db-fra.com

Impossible de trouver une @SpringBootConfiguration, vous devez utiliser @ContextConfiguration ou @SpringBootTest (classes = ...) avec votre test.

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;
}
5
lapots

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 

2
Yuriy Tsarkov

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.

1
Saurabh Parmar

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.

0
VC2019