2017-11-25 560 views
0

我正在使用Spring Data JPASpring Boot。應用程序的佈局是這樣的無法找到@SpringBootConfiguration,您需要使用@ContextConfiguration或@SpringBootTest(classes = ...)與您的測試

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 loooks這樣

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

如果標註'RelationalPlayerRepositoryTests'用'@ContextConfiguration(類= GrandJourneyMonolithApplication.class)'會發生什麼? –

+0

@SamBrannen它顯示錯誤,它'無法用嵌入替換數據源' – lapots

回答

0

當SpringBoot啓動時,它從頂部到項目中找到的配置文件的底部掃描類路徑。您的配置是在另一個文件下,這是問題的原因。配置上打動你的整體包,一切都會好起來的

+0

,但不應該有可能在測試中指定配置類? – lapots

+0

我也移動了'配置'類,它沒有幫助 – lapots

+0

上面的答案應該是正確的。按照[文檔中建議的](https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#using-boot-structuring-your-code)構建您的應用程序,測試應該能夠搜索以查找配置。由於禁用自動配置的註釋,您可能會遇到其他問題。嘗試刪除'@ EnableJpaRepositories','@ EntityScan'和'@ ComponentScan'。 –

相關問題