web-dev-qa-db-ja.com

@SpringBootConfigurationが見つかりません。テストで@ContextConfigurationまたは@SpringBootTest(classes = ...)を使用する必要があります

使ってます Spring Data JPAおよびSpring Boot。アプリのレイアウトはこちら

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

私のオブジェクトのリポジトリは次のようになります

public interface RelationalPlayerRepository extends JpaRepository<Player, Long> {
}

さらに、リポジトリに構成を提供しました

@Configuration
@EnableJpaRepositories(basePackages = "com.lapots.game.monolith.repository.relational")
@EntityScan("com.lapots.game.monolith.domain")
public class RelationalDBConfiguration {
}

私の主なアプリケーションは次のようになります

@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);
        };
    }
}

アプリケーションのテストは次のようになります

@RunWith(SpringRunner.class)
@SpringBootTest
public class GrandJourneyMonolithApplicationTests {

    @Test
    public void contextLoads() {
    }

}

リポジトリのテストは次のようになります

@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;
    }
}

しかし、テストを実行しようとすると、エラーが発生します

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)

何が問題ですか?ドメインPlayerはこのように見えます

@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

SpringBootが起動すると、プロジェクトの最上部から最下部までクラスパスをスキャンして、構成ファイルを見つけます。あなたの設定は別のファイルの下にあり、それが問題の理由です。構成の上限をmonolithパッケージに移動すると、すべてがうまくいきます

5
Yuriy Tsarkov

src/test/Javaパッケージとsrc/main/Javaパッケージは一致する必要があります。 src/main/Javaパッケージがcom.comp.exampleで始まっているのと同じ問題がありましたが、src/test/Javaパッケージはcom.sample.exampleで始まっていました。このスプリングブートのため、アプリケーションは@SpringBootApplicationクラスから取得するアプリケーションの構成を取得できませんでした。したがって、テストケースは、@SpringBootApplicationsrc/main/Javaが記述されているパッケージに該当するはずです。

2
Saurabh Parmar

単純なRESTコントローラでSpring Bootを使用しています。JPAを使用しておらず、コントローラテストのタイトルで指定されているのと同じエラーが発生しました。また、Springのカスタム構成を使用していますブートアプリ。上記の2番目の回答(18年10月19日7:20 Saurabh Parmarで回答)が役に立ちました。私にとっての根本的な原因もパッケージ名でした。src/ test/Javaでの私のテスト用のパッケージが一致しませんでしたsrc/main/Javaの下にあります。

0
VC2019