仅在测试的子集中使用MockRestServiceServer



我想使用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使用情况的更多信息,请参阅本文。

相关内容

  • 没有找到相关文章

最新更新