本文介绍了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发送任何内容有几个原因:

  1. WireMock在存根时只接受相对URL,因此传递包括协议和域的完整URL将不起作用。请尝试与stubFor(post(urlPathEqualTo("/v1/private/product-reviews/business-units/<bid>/invitation-links")等效的内容。
  2. 您的被测类似乎没有任何方法知道WireMock在哪个主机/端口上运行,并且没有设置转发代理,因此代码可能仍在尝试调用真正的TrustPilot API。

要解决2.您有几个选择:

  1. 将测试中的类/代码设置为使用localhost作为目标主机,使用wireMockRule.port()的结果作为端口号,如果您使用HTTPS,则使用wireMockRule.httpsPort()
  2. 使用新的auto JVM proxy setup功能通过WireMock代理应用程序的调用。这假设您使用的是WireMock 2.31.0+,并且您的应用程序的HTTP客户端支持JVM代理系统属性。

这篇关于Wiremock未收到任何请求的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

05-19 11:39