小编典典

在集成测试中覆盖bean

spring-boot

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

如何确定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)
    }
}

阅读 257

收藏
2020-05-30

共1个答案

小编典典

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

对评论的反应:

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

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

2020-05-30