【问题标题】:Wiremock does not receive any requestsWiremock 没有收到任何请求
【发布时间】:2021-11-06 01:01:41
【问题描述】:

我正在为一个资源(带有 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 设置有问题吗?有任何想法吗?谢谢!

【问题讨论】:

    标签: spring integration-testing resteasy wiremock


    【解决方案1】:

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

    1. WireMock 在存根时只接受相对 URL,因此传递包括协议和域在内的完整 URL 将不起作用。请改用与stubFor(post(urlPathEqualTo("/v1/private/product-reviews/business-units/&lt;bid&gt;/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 代理系统属性。

    【讨论】:

    • 就是这样。现在正在运行,非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-14
    • 1970-01-01
    • 2015-10-20
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 2019-01-07
    相关资源
    最近更新 更多