2017-11-25 557 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'。 –

相关问题