首页 > 解决方案 > 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"));

    }

但我得到的是(我在网址中的实际出价):

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 设置有问题吗?有任何想法吗?谢谢!

标签: springintegration-testingresteasywiremock

解决方案


目前没有向 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()端口号的结果,或者wireMockRule.httpsPort()如果您使用的是 HTTPS。
  2. 使用新的自动 JVM 代理设置功能通过 WireMock 代理您的应用程序调用。这假设您使用的是 WireMock 2.31.0+ 并且您的应用程序的 HTTP 客户端尊重 JVM 代理系统属性。

推荐阅读