编程语言
首页 > 编程语言> > java – 在Integration测试中覆盖bean

java – 在Integration测试中覆盖bean

作者:互联网

对于我的Spring-Boot应用程序,我通过@Configuration文件提供了RestTemplate,因此我可以添加合理的默认值(ex Timeouts).对于我的集成测试,我想模拟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.

对评论的反应:

要保持缓存中的上下文不使用@DirtiesContext,但使用@ContextConfiguration(name =“contextWithFakeBean”)并且它将创建单独的上下文,同时它将在缓存中保留默认上下文. Spring会在缓存中保留两者(或者你有多少个上下文).

我们的构建就是这种方式,大多数测试都使用默认的非堆积配置,但是我们有4-5个假冒豆类测试.默认上下文很好地重用

标签:java,spring,spring-boot,spring-test,spring-web
来源: https://codeday.me/bug/20190930/1834779.html