在我的Spring Boot项目中,我有一个用@SpringBootConfiguration
注释的主类。我还有一些使用@SpringApplicationConfiguration
的单元测试,它指向一个内部类,它定义了一个Spring上下文,用于我的单元测试(使用一些模拟)。
我现在想编写一个集成测试来启动应用程序的完整上下文。但是,这不起作用,因为它还会选择在其他单元测试中定义为内部类的Spring上下文。
避免这种情况的最佳方法是什么?我确实在exclude
上看到了excludeName
和@SpringBootConfiguration
属性,但我不确定如何使用它们。
更新:
更多解释问题的代码:
我的主要课程:
package com.company.myapp;
@SpringBootApplication
@EnableJpaRepositories
@EnableTransactionManagement
@EntityScan(basePackageClasses = {MyApplication.class, Jsr310JpaConverters.class})
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
我有一个Spring REST Docs的单元测试:
package com.company.myapp.controller
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration
@WebAppConfiguration
public class SomeControllerDocumentation {
@Rule
public final RestDocumentation restDocumentation = new RestDocumentation("target/generated-snippets");
// Some test methods here
// Inner class that defines the context for the unit test
public static class TestConfiguration {
@Bean
public SomeController someController() { return new SomeController(); }
@Bean
public SomeService someService() { return new SomeServiceImpl(); }
@Bean
public SomeRepository someRepository() { return mock(SomeRepository.class);
}
因此单元测试使用内部类中定义的上下文。现在我想要一个不同的测试来测试"正常"应用程序的应用程序上下文启动:
package com.company.myapp;
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(MyApplication.class)
@WebAppConfiguration
public class MyApplicationTest {
@Autowired
private ApplicationContext applicationContext;
@Test
public void whenApplicationStarts_thenContextIsInitialized() {
assertThat(applicationContext).isNotNull();
}
}
此测试现在不仅会连接它应该的东西,还会连接SomeControllerDocumentation.TestConfiguration内部类中的bean。这是我想避免的。
答案 0 :(得分:3)
您可以使用配置文件:使用@Profile("unit-test")
和@Profile("integration-test")
注释相关配置Bean,并在测试中指定应通过@ActiveProfiles
激活哪个配置文件。
然而,听起来你只需重新组织配置结构就可以完全避免这个问题。但是,如果没有看到任何代码,很难做出任何假设。
答案 1 :(得分:1)
自Spring Boot 1.4以来,可以通过使用@TestConfiguration
答案 2 :(得分:-2)
我想你谈的是@Ignore