对于我的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) } }
从Spring Boot 1.4.x开始,可以使用@MockBean注释来伪造Spring bean。
@MockBean
对评论的反应:
要将上下文保留在缓存中,请不要使用@DirtiesContext,而是使用@ContextConfiguration(name = "contextWithFakeBean")和,它将创建单独的上下文,同时将默认上下文保留在缓存中。Spring会将两者(或您拥有的上下文)都保留在缓存中。
@DirtiesContext
@ContextConfiguration(name = "contextWithFakeBean")
我们的构建方式是这样的,其中大多数测试都使用默认的非污染配置,但是我们有4-5个测试是伪造的。默认上下文可以很好地重用