Wiremock 返回 404 存根 url

Wiremock returning 404 for a stubbed url

我定义的 wireMock 服务器如下:-

    private WireMockServer wireMockServer;
        @Before
        public void preSetup() throws Exception {
          wireMockServer = new WireMockServer(56789);
          wireMockServer.start();
        };

        @Override
        @After
        public void tearDown() {
          wireMockServer.stop();
        }

        @Test
        public void testSendMatchingMessage() throws Exception {

          wireMockServer.stubFor(get(urlEqualTo("/orders/v1/ordersearch/"))
            .willReturn(aResponse().withStatus(200).withBody("<response>Some content</response>")));

       }

但是每当我点击 url 类似下面的内容时

http://0.0.0.0:56789/orders/v1/ordersearch/?field=address%2Cfinance%2Cshipping&limit=10&page=2&q=createdFrom.gt%7E2016-01-11T10%3A12%3A13

我收到以下错误:-

    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
    <title>Error 404 NOT_FOUND</title>
    </head>
    <body><h2>HTTP ERROR 404</h2>
    <p>Problem accessing /__files/orders/v1/ordersearch/. Reason:
    <pre>    NOT_FOUND</pre></p><hr /><i><small>Powered by Jetty://</small></i><br/>                                                
    <br/>                                                
    <br/>                                                
    <br/>                                                
    <br/>                                                
    <br/>                                                
    <br/>                                                
    <br/>                                                
    <br/>     
    </body>
    </html>

谁能告诉我我做错了什么?

根据 Stubbing - Wiremock("wiremockserver urlequalto" 上 Google 中的第一个):

Note: you must use urlPathEqualTo or urlPathMatching to specify the path, as urlEqualTo or urlMatching will attempt to match the whole request URL, including the query parameters.

对于任何试图将 Wiremock 添加到 Android 应用并偶然发现这个问题的人:

如果您运行您的模拟网络调用完成后,它将无法工作。这似乎很明显,但我被它绊倒了。

当您 运行 进行 Espresso 测试时,默认情况下 activity 测试规则会立即启动 activity,因此 activity 会触发并拉取其配置我的模拟代码之前的数据实际上是 运行。我看到了与 OP 相同的错误。

解决方法是让您的 activity 测试规则最初不启动,然后模拟您的数据,并告诉 activity 在您完成所有这些后启动。

我常用的是urlPathMatching导入的时候可以得到:

import static com.github.tomakehurst.wiremock.client.WireMock.*;

所以在你的测试中,你会有 class MyServiceservice 对外部 api "/orders/v1/ordersearch/" 进行休息调用是将用 wiremock 模拟的调用 stubFor.

然后mockServer.verify当服务service.sendToExternalUrl().

时mockServer已经获取到外部api
  private WireMockServer mockServer;
  private MyService service;

  @Before
  public void preSetup() {
    mockServer = new WireMockServer(56789);
    mockServer.start();
  }

  @After
  public void tearDown() {
    mockServer.stop();
  }

  @Test
  public void testSendMatchingMessage() {
    UrlPattern externalUrl = urlPathMatching("/orders/v1/ordersearch/");
    stubFor(get(externalUrl).willReturn(aResponse().withStatus(200)));

    service.sendToExternalUrl();

    mockServer.verify(1, getRequestedFor(externalUrl)
        .withRequestBody(containing(new JSONObject().put("orders", "results").toString())));
  }

只是添加一个不同的场景,在我的情况下导致了完全相同的问题:

确保没有其他东西在使用 Wiremock 端口

我在后台有一个 Docker 容器 运行,它映射到我的 Wiremock 使用的同一端口。这很容易被遗漏,因为当 运行 我的测试时 Wiremock 没有抛出任何绑定错误(或任何其他类型) - 它正常启动并且我的测试请求只是 return 404.