【问题标题】:Wiremock returning 404 for a stubbed urlWiremock 为存根 url 返回 404
【发布时间】:2016-03-05 20:22:33
【问题描述】:

我已经定义了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>")));

       }

但是每当我点击下面的网址时

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>

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

【问题讨论】:

    标签: java wiremock


    【解决方案1】:

    根据Stubbing - Wiremock(谷歌“wiremockserver urlequalto”上的第一个):

    注意:您必须使用urlPathEqualTo 或urlPathMatching 来指定 路径,因为urlEqualTo 或urlMatching 将尝试匹配整个 请求 URL,包括查询参数。

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

        【解决方案3】:

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

        确保没有其他设备正在使用 Wiremock 端口。

        我在后台运行了一个 Docker 容器,该容器映射到我的 Wiremock 使用的同一端口。这很容易被忽略,因为 Wiremock 在运行我的测试时没有抛出任何绑定错误(或任何其他类型) - 它正常启动,我的测试请求只会返回 404。

        【讨论】:

          【解决方案4】:

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

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

          因此,在您的测试中,您将拥有 MyService 类的 service,它将对外部 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())));
            }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2017-12-31
            • 2019-12-03
            • 2017-05-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多