我已经定义了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>
有人可以让我知道我做错了吗?
答案 0 :(得分:17)
根据Stubbing - Wiremock(谷歌中的第一个“wiremockserver urlequalto”):
注意:您必须使用
urlPathEqualTo
或urlPathMatching
来指定 路径,urlEqualTo
或urlMatching
将尝试匹配整体 请求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。