Wiremock 没有收到任何请求

Wiremock does not receive any requests

我正在为资源(带有 resteasy 的 Jax-rs)编写集成测试,它会调用对 Trustpilot Api 的第三方请求以获得对产品的评论 link。 在我的测试中,我想通过使用 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 的 recognized/mocked。

我的 Wiremock 设置有问题吗?有任何想法吗?谢谢!

目前没有向 WireMock 发送任何内容的原因有几个:

  1. WireMock 在存根时仅接受相对 URLs,因此传递完整的 URL 包括协议和域将不起作用。试试等同于 stubFor(post(urlPathEqualTo("/v1/private/product-reviews/business-units/<bid>/invitation-links") 的东西。
  2. 您的 class 测试中似乎没有任何方法可以知道哪个 host/port WireMock 运行 打开并且没有设置转发代理,因此代码大概是仍在尝试调用真正的 Trustpilot API.

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

  1. 设置你的 class/code 被测以使用 localhost 作为目标主机和 wireMockRule.port() 的结果作为端口号,或者 wireMockRule.httpsPort() 如果你是在 HTTPS 上。
  2. 使用新的 auto JVM proxy setup 功能通过 WireMock 代理您应用的调用。这假设您使用的是 WireMock 2.31.0+,并且您的应用程序的 HTTP 客户端尊重 JVM 代理系统属性。