java - 在集成测试中覆盖 bean

标签 java spring spring-boot spring-test spring-web

对于我的 Spring-Boot 应用程序,我通过 @Configuration 文件提供了一个 RestTemplate,以便我可以添加合理的默认值(例如超时)。对于我的集成测试,我想模拟 RestTemplate,因为我不想连接到外部服务 - 我知道期望什么响应。我尝试在集成测试包中提供不同的实现,希望后者覆盖真正的实现,但检查日志却是另一种方式:真正的实现会覆盖测试。

如何确保TestConfig中的那个是使用的那个?

这是我的配置文件:

@Configuration
public class RestTemplateProvider {

    private static final int DEFAULT_SERVICE_TIMEOUT = 5_000;

    @Bean
    public RestTemplate restTemplate(){
        return new RestTemplate(buildClientConfigurationFactory());
    }

    private ClientHttpRequestFactory buildClientConfigurationFactory() {
        HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory();
        factory.setReadTimeout(DEFAULT_SERVICE_TIMEOUT);
        factory.setConnectTimeout(DEFAULT_SERVICE_TIMEOUT);
        return factory;
    }
}

集成测试:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = TestConfiguration.class)
@WebAppConfiguration
@ActiveProfiles("it")
public abstract class IntegrationTest {}

TestConfiguration 类:

@Configuration
@Import({Application.class, MockRestTemplateConfiguration.class})
public class TestConfiguration {}

最后是 MockRestTemplateConfiguration

@Configuration
public class MockRestTemplateConfiguration {

    @Bean
    public RestTemplate restTemplate() {
        return Mockito.mock(RestTemplate.class)
    }
}

最佳答案

从 Spring Boot 1.4.x 开始,可以选择使用 @MockBean 注释来伪造 Spring bean。

评论 react :

在缓存中保留上下文不要使用 @DirtiesContext,而是使用 @ContextConfiguration(name = "contextWithFakeBean") 它将创建单独的上下文,同时它会保留缓存中的默认上下文。 Spring 会将两者(或您拥有的多少个上下文)都保存在缓存中。

我们的构建是这样的,其中大多数测试都使用默认的非污染配置,但我们有 4-5 个测试是伪造的 bean。默认上下文很好地重用

关于java - 在集成测试中覆盖 bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35742920/

相关文章:

java - com.sun.jersey.spi.container.ContainerResponse : A message body writer for Java class

java - 将方法转换为 DAO 层中的泛型方法

java - 实现一个根据值返回对象的工厂

java - Spring:使用 BadRequest 处理不明确的映射

java - 如何配置 Spring 在实例化 POJO 时使用我的工厂

mysql - 在对我的 api 进行每秒 2500 次的负载测试时,出现以下错误

java - 应用程序内空指针异常

java - 如何在 Spring Boot 2.00 中使用设备解析器

postgresql - Flyway 7.5.1及以上版本无法初始化Zonky-test DB

java - 无法解析字符串值 'jwt.secret' 中的占位符 "${jwt.secret}"