我想使用MockRestServiceServer
测试来自服务的传出HTTP调用。我使用以下代码使其工作:
@SpringBootTest
class CommentFetcherTest {
@Autowired
RestTemplate restTemplate;
@Autowired
CommentFetcher commentFetcher;
@Test
public void shouldCallExternalService(){
MockRestServiceServer mockServer = MockRestServiceServer.createServer(restTemplate);
mockServer.expect(ExpectedCount.once(), requestTo("/test/endpoint")).andExpect(method(HttpMethod.GET));
//when
commentFetcher.fetchData();
mockServer.verify();
}
}
然而,我遇到的问题是,RestTemplate是套件中所有测试之间共享的bean,这使得无法进一步运行应该调用外部服务的集成测试。这导致:
java.lang.AssertionError: No further requests expected
如何可能仅将MockRestServiceServer
用于测试的子集?我无法通过@Autowired
摆脱依赖注入,也无法在等测试中构建我的服务
RestTemplate restTemplate = new RestTemplate();
CommentFetcher commentFetcher = new CommentFetcher(restTemplate);
因为这不会从application.properties
读取正确运行我的服务所必需的属性。
Spring Boot提供了一种方便的方法,可以使用@RestClientTest
测试使用Spring的RestTemplate
的客户端类。
有了这个注释,您就得到了一个Spring Test Context,它只包含相关的bean,而不包含整个应用程序上下文(这就是当前使用@SpringBootTest
得到的(。
MockRestServiceServer
也是该上下文的一部分,并且RestTemplate
被配置为针对它
基本测试设置如下所示:
@RestClientTest(CommentFetcher.class)
class UserClientTest {
@Autowired
private CommentFetcher userClient;
@Autowired
private MockRestServiceServer mockRestServiceServer;
// ...
}
剩下的就是存根HTTP方法调用,然后在测试中的类上调用该方法(本例中为commentFetcher.fetchData();
(。
如果您想了解有关如何使用@RestClientTest
来测试RestTemplate
使用情况的更多信息,请参阅本文。