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 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())));
}
只是添加一个不同的场景,在我的情况下导致了完全相同的问题:
确保没有其他东西在使用 Wiremock 端口。
我在后台有一个 Docker 容器 运行,它映射到我的 Wiremock 使用的同一端口。这很容易被遗漏,因为当 运行 我的测试时 Wiremock 没有抛出任何绑定错误(或任何其他类型) - 它正常启动并且我的测试请求只是 return 404.
我定义的 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
orurlPathMatching
to specify the path, asurlEqualTo
orurlMatching
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 MyService
的 service
对外部 api "/orders/v1/ordersearch/"
进行休息调用是将用 wiremock 模拟的调用 stubFor
.
然后mockServer.verify
当服务service.sendToExternalUrl()
.
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.