Wiremock为一个存根网址返回404

时间:2016-03-05 20:22:34

标签: wiremock

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

有人可以让我知道我做错了吗?

4 个答案:

答案 0 :(得分:17)

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

  

注意:您必须使用urlPathEqualTourlPathMatching来指定   路径,urlEqualTourlMatching将尝试匹配整体   请求URL,包括查询参数。

答案 1 :(得分:2)

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

如果您在 之后运行模拟,将无法进行网络调用。这看起来似乎很明显,但是我被绊倒了。

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

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

答案 2 :(得分:0)

我通常使用的是urlPathMatching,您可以在导入时获得:

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

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

答案 3 :(得分:0)

只需添加一个不同的场景,就我而言,这会导致完全相同的问题:

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

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