Spring boot 测试中排除配置

hot*_*zst 5 java testing spring-boot

我在 Maven 项目中有以下设置。生产代码的配置类:

package com.example;
@Configuration
public class MyConfiguration {
    @Bean
    public A beanA() {
      return new A();
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

然后我有一个测试,它有一个内部Configuration

package com.example;
@RunWith(SpringRunner.class)
@ContextConfiguration(classes = {MyConfiguration.class, SpringConfigurationTest.MyTestConfiguration.class})
public class SpringConfigurationTest {
    @TestConfiguration
    static class MyTestConfiguration {
        @Bean
        @Primary
        public A beanA() {
          return mock(A.class);
        }    
    }
}
Run Code Online (Sandbox Code Playgroud)

这堂课的测试效果很好。然后我在子包中有另一个测试类:

package com.example.sub;
@RunWith(SpringRunner.class)
@ContextConfiguration(classes = {MyConfiguration.class, AnotherSpringConfigurationTest.MyTestConfiguration.class})
public class AnotherSpringConfigurationTest {
    @TestConfiguration
    static class MyTestConfiguration {
        @Bean
        public B beanB() {
          return new B()
        }    
    }
}
Run Code Online (Sandbox Code Playgroud)

SpringConfigurationTest.MyTestConfiguration在此类中运行测试时,还包括测试配置。我猜其原因是包含MyConfiguration在根目录中。效果是AnotherSpringConfigurationTestbeanA被模拟而不是真实的实例。

如何避免其他测试中的配置类“泄漏”到其他测试中?

我已经看到用于集成测试的 Spring-boot 默认配置文件,它在 Spring Boot 1.4.1 中使用 Spring 配置文件,而我使用的是 Spring Boot 2.0.1。尽管我确信这是可以做到的。

我能想到的另一种方法是使用组件扫描来获取上下文并排除所有我不想要的内容,但这有点麻烦,因为我更喜欢一种定义我想要使用的内容的方法不应该使用什么。

Spring Boot 2 是否有一个简单而优雅的解决方案来避免上下文配置冲突?

Gab*_*Leg 1

首先,我不喜欢将配置类放在另一个类中的想法。我不知道这是否经常发生,我对 Spring 有点陌生。但这是我要做的:

第一个配置文件:

@Configuration
@Import(MyConfiguration.class)
public class MyTestConfiguration {
    @Bean
    @Primary // added to let know on @Autowired to use this one instead of the one in first MyConfiguration.class
    public A beanA() {
      return mock(A.class);
    }    
}
Run Code Online (Sandbox Code Playgroud)

第二个配置文件:

@Configuration
@Import(MyConfiguration.class)
public class MyOtherTestConfiguration {
    @Bean
    public B beanB() {
      return new B()
    }    
}
Run Code Online (Sandbox Code Playgroud)

我不熟悉@TestConfiguration。这就是我使用@Configuration.

第一节测试课:

package com.example;
@RunWith(SpringRunner.class)
@ContextConfiguration(classes = MyTestConfiguration.class)
public class SpringConfigurationTest {

}
Run Code Online (Sandbox Code Playgroud)

第二次测试班:

package com.example.sub;
@RunWith(SpringRunner.class)
@ContextConfiguration(classes = MyOtherTestConfiguration.class)
public class AnotherSpringConfigurationTest {

}
Run Code Online (Sandbox Code Playgroud)