junit - 如何在 spring-boot 中使用 resttemplate 模拟调用另一个服务的服务?

标签 junit mockito spring-boot-test

各位专家下午好,

我有一个要求,我将调用 3 个 REST API 的顺序调用作为单个客户端调用 GET/offers 的一部分,以检索百货商店不同 channel 中每种产品的可用报价,如下所示

  1. 获取百货商店的所有过道/aisels
  2. 获取过道/aisles/{aisleID}/products 中的所有产品
  3. 获取产品/product/{productId/offers的所有报价

    要使用 RestTemplate 交换方法从我的 @Service 类执行此操作:

    ResponseEntity aisles= restTemplate.exchange(url, HttpMethod.GET, requestEntity, Aisles.class);

然后在循环中检索每个 aisleId 并调用第二个 API 以获取产品

ResponseEntity<Products> products= restTemplate.exchange(url,
                    HttpMethod.GET, requestEntity, Products.class);

然后在循环中检索每个 productId 并调用第三个 API 以获取优惠

最后整理所有响应,将报价列表发送给客户。

现在,我是编写 JUnit 的 mockito 框架的新手。我的服务类有一个名为 retrieveAllOffers() 的方法,其中我有上面的 3 种交换方法。

我想知道如何在我的 Junit 中模拟这 3 个调用以获得成功的响应场景。

非常感谢您的帮助。

最佳答案

您可以只模拟服务的响应,而不是模拟其余模板。为此,您可以使用 Wiremock ( http://wiremock.org/ ),它提供了一个 api 来对特定 URLS 的调用进行 stub ,并模拟它们对您喜欢的任何内容的响应,并验证它们是否被调用。

对于您的情况,您需要 3 个 stub ,每个 stub 一个。例如对于这个方法 restTemplate.exchange(url, GET, requestEntity, Products.class); 你提供的 stub 看起来像

stubFor(get(urlEqualTo("yourUrl"))
  .willReturn(aResponse()
    .withStatus(200)
    .withBody(new ObjectMapper().writeValueAsString(yourResponseObject)
    .withHeader("Content-Type", MediaType.APPLICATION_JSON_VALUE))

请注意,您的 url 将需要指向运行 wiremock 的服务器(如果您使用 java 依赖项和 junit 规则,它将是 localhost:wiremockPort )

设置非常简单,因为您需要向测试添加一个规则

@Rule public WireMockRule wireMockRule = new WireMockRule(options().dynamicPort()); 在这里查看规则的配置 http://wiremock.org/docs/configuration/

最后你验证你的 stub 是用

调用的
verify(getRequestedFor(urlEqualTo("/yourUrl"))
  .withRequestBody(equalTo(new ObjectMapper().writeValueAsString(theObjectThatShouldBePosted))));

希望对您有所帮助!

关于junit - 如何在 spring-boot 中使用 resttemplate 模拟调用另一个服务的服务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57584377/

相关文章:

java - 随机(?)ElementNotVisibleException

java - Jenkins 使用错误的 JUnit 版本

java - 在 DAO 层的 JUnit 中找不到当前线程的 session

java - Spring Boot Junit 测试用例中 contextLoads 方法的用途是什么?

java - 使用 jUnit 在 Hibernate 和 Spring 中神奇地更新实体

java - 解释mockito matches(str) 与 same(str) 这种行为的原因

java - 如何使用 Mockito for page.map(mapper::toDto) 模拟 Mapstruct 的 toDto 方法

android - 使用 Matchers.anyObject() 验证挂起函数

jsonpath - 在 Spring Boot 测试中将 JSON 中的对象与 jsonpath 匹配

java - 阻止 Spring Boot 测试命中 SpringBootApplication 类的 @PostContruct