本文介绍了Wiremock未收到任何请求的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我正在为一个资源(使用RESTEasy的JAX-rs)编写一个集成测试,它调用对TrustPilot Api的第三方请求以获取产品的审查链接。在我的测试中,我希望使用Wiremock模拟此调用,并使用RESTEasy Dispatcher调用请求。下面的代码显示了我的设置(名称等已更改)。@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = { MyResourceTestContext.class })
public class MyResourceIntegrationTest {
@Rule
public WireMockRule wireMockRule = new WireMockRule(wireMockConfig().dynamicPort().dynamicHttpsPort());
@Autowired
private MyResource myResource;
private Dispatcher dispatcher;
private MockHttpResponse response;
@Before
public void setUp() throws Exception {
dispatcher = MockDispatcherFactory.createDispatcher();
dispatcher.getRegistry().addSingletonResource(myResource);
response = new MockHttpResponse();
}
@Test
public void testResourceShouldReturnRedirectToTrustpilotreview() throws Exception {
URI apiRequestURI = UriBuilder
.fromUri("https://api.trustpilot.com/v1/private/product-reviews/business-units"
+ "/{businessUnitId}}/invitation-links")
.build(BUSINESS_UNIT_ID);
URI expectedRedirectURI = UriBuilder.fromUri("https://products.trustpilot.com/#evaluate/{reviewLinkId}")
.build(REVIEW_LINK_ID);
stubFor(post(apiRequestURI.toString())
.willReturn(okJson("{"reviewLinkId":"" + REVIEW_LINK_ID + "","
+ ""reviewUrl":"" + expectedRedirectURI.toString() + ""}")));
MockHttpRequest request = MockHttpRequest.get("/myResource");
dispatcher.invoke(request, response);
WireMock.verify(1, postRequestedFor(urlEqualTo(apiRequestURI.toString())));
Assert.assertEquals(HttpStatus.TEMPORARY_REDIRECT.value(), response.getStatus());
Assert.assertEquals(expectedRedirectURI.toString(), response.getOutputHeaders().getFirst("Location"));
}
但我得到的是(URL中的实际出价):
com.github.tomakehurst.wiremock.client.VerificationException: Expected at least one request matching: {
"url" : "https://api.trustpilot.com/v1/private/product-reviews/business-units/<bid>/invitation-links",
"method" : "POST"
}
Requests received: [ ]
使用调试器进入请求,我可以说此请求和其他请求实际上执行成功。但Wiremock无法识别/嘲笑它们。我的Wiremock设置是否有问题?有什么主意吗?谢谢!
推荐答案
目前没有向WireMock发送任何内容有几个原因:
- WireMock在存根时只接受相对URL,因此传递包括协议和域的完整URL将不起作用。请尝试与
stubFor(post(urlPathEqualTo("/v1/private/product-reviews/business-units/<bid>/invitation-links")
等效的内容。 - 您的被测类似乎没有任何方法知道WireMock在哪个主机/端口上运行,并且没有设置转发代理,因此代码可能仍在尝试调用真正的TrustPilot API。
要解决2.您有几个选择:
- 将测试中的类/代码设置为使用
localhost
作为目标主机,使用wireMockRule.port()
的结果作为端口号,如果您使用HTTPS,则使用wireMockRule.httpsPort()
。 - 使用新的auto JVM proxy setup功能通过WireMock代理应用程序的调用。这假设您使用的是WireMock 2.31.0+,并且您的应用程序的HTTP客户端支持JVM代理系统属性。
这篇关于Wiremock未收到任何请求的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!