首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >仅在测试子集中使用MockRestServiceServer

仅在测试子集中使用MockRestServiceServer
EN

Stack Overflow用户
提问于 2021-01-04 20:16:07
回答 1查看 113关注 0票数 0

我想使用MockRestServiceServer测试从我的服务传出的HTTP调用。我使用以下代码使其正常工作:

代码语言:javascript
复制
@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,这使得不可能进一步运行应该调用外部服务的集成测试。这将导致:

代码语言:javascript
复制
java.lang.AssertionError: No further requests expected

怎么可能只对测试的子集使用MockRestServiceServer呢?我不能通过@Autowired摆脱依赖注入,并在测试中构造我的服务,比如

代码语言:javascript
复制
RestTemplate restTemplate = new RestTemplate();
CommentFetcher commentFetcher = new CommentFetcher(restTemplate);

因为这不会从application.properties读取服务正常运行所必需的属性。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-06 21:21:37

Spring Boot提供了一种方便的方法来测试您的客户机类,这些客户机类使用@RestClientTest来使用Spring的RestTemplate

有了这个注解,您就得到了一个只包含相关bean而不包含整个应用程序上下文的Spring Test上下文(这就是您当前使用@SpringBootTest获得的上下文)。

MockRestServiceServer也是此上下文的一部分,并且RestTemplate被配置为以它为目标。

基本的测试设置可能如下所示:

代码语言:javascript
复制
@RestClientTest(CommentFetcher.class)
class UserClientTest {
 
  @Autowired
  private CommentFetcher userClient;
 
  @Autowired
  private MockRestServiceServer mockRestServiceServer;
 
  // ...
 
 
}

剩下的就是存根HTTP方法调用,然后调用被测类上的方法(本例中为commentFetcher.fetchData();)。

如果您想了解有关如何使用@RestClientTest测试RestTemplate使用情况的更多信息,请参考此article

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65562586

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档