BKA*_*BKA 3 junit mockito spring-boot-test
各位专家下午好,
我有一个要求,我将调用 3 个 REST API 的顺序调用作为单个客户端调用 GET /offers 的一部分,以检索百货商店不同通道中每种产品的可用报价,如下所示
获取产品 /product/{productId/offers 的所有报价
要@Service使用 RestTemplate 交换方法在我的类中执行此操作:
ResponseEntity aisles=restTemplate.exchange(url, HttpMethod.GET, requestEntity, Aisles.class);
aisleId然后循环检索每个产品并调用第二个 API 来获取产品
ResponseEntity<Products> products= restTemplate.exchange(url,
HttpMethod.GET, requestEntity, Products.class);
Run Code Online (Sandbox Code Playgroud)
productId然后循环检索每个并调用第三个 API 来获取 Offers
最后整理所有回复,将报价列表发送给客户。
现在,我对用于编写 JUnit 的 mockito 框架很陌生。我的服务类有一个名为retrieveAllOffers() 的方法,其中有如上所述的 3 个交换方法。
我想知道如何在 Junit 中模拟这 3 个调用才能获得成功的响应场景。
非常感谢您的帮助。
您可以仅模拟服务的响应,而不是模拟其余模板。为此,您可以使用 Wiremock ( http://wiremock.org/ ),它提供了一个 api 来对特定 URL 进行存根调用,并模拟它们对您喜欢的任何内容的响应,并验证它们是否被调用。
对于您的情况,您需要 3 个存根,每个交换一个。例如,对于这个方法
restTemplate.exchange(url, GET, requestEntity, Products.class);
,您提供的存根看起来像
stubFor(get(urlEqualTo("yourUrl"))
.willReturn(aResponse()
.withStatus(200)
.withBody(new ObjectMapper().writeValueAsString(yourResponseObject)
.withHeader("Content-Type", MediaType.APPLICATION_JSON_VALUE))
Run Code Online (Sandbox Code Playgroud)
请注意,您的网址需要指向运行wiremock的服务器(如果您使用java依赖项和junit规则,它将是 localhost:wiremockPort )
设置非常简单,因为您需要向测试添加一条规则
@Rule public WireMockRule wireMockRule = new WireMockRule(options().dynamicPort());
在这里查看规则的配置http://wiremock.org/docs/configuration/
最后你验证你的存根是否被调用
verify(getRequestedFor(urlEqualTo("/yourUrl"))
.withRequestBody(equalTo(new ObjectMapper().writeValueAsString(theObjectThatShouldBePosted))));
Run Code Online (Sandbox Code Playgroud)
希望有帮助!
| 归档时间: |
|
| 查看次数: |
6397 次 |
| 最近记录: |