在Spring中排除单元测试@Configurations的最佳方法是什么?

时间:2015-12-23 17:04:11

标签: java spring unit-testing spring-boot

在我的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。这是我想避免的。

3 个答案:

答案 0 :(得分:3)

您可以使用配置文件:使用@Profile("unit-test")@Profile("integration-test")注释相关配置Bean,并在测试中指定应通过@ActiveProfiles激活哪个配置文件。

然而,听起来你只需重新组织配置结构就可以完全避免这个问题。但是,如果没有看到任何代码,很难做出任何假设。

答案 1 :(得分:1)

自Spring Boot 1.4以来,可以通过使用@TestConfiguration

对单元测试中的配置进行注释来避免此问题

答案 2 :(得分:-2)

我想你谈的是@Ignore