我想使用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读取服务正常运行所必需的属性。
发布于 2021-01-06 21:21:37
Spring Boot提供了一种方便的方法来测试您的客户机类,这些客户机类使用@RestClientTest来使用Spring的RestTemplate。
有了这个注解,您就得到了一个只包含相关bean而不包含整个应用程序上下文的Spring Test上下文(这就是您当前使用@SpringBootTest获得的上下文)。
MockRestServiceServer也是此上下文的一部分,并且RestTemplate被配置为以它为目标。
基本的测试设置可能如下所示:
@RestClientTest(CommentFetcher.class)
class UserClientTest {
@Autowired
private CommentFetcher userClient;
@Autowired
private MockRestServiceServer mockRestServiceServer;
// ...
}剩下的就是存根HTTP方法调用,然后调用被测类上的方法(本例中为commentFetcher.fetchData();)。
如果您想了解有关如何使用@RestClientTest测试RestTemplate使用情况的更多信息,请参考此article。
https://stackoverflow.com/questions/65562586
复制相似问题