com.github.tomakehurst.wiremock.client.VerificationException: 预计至少有一个请求匹配
com.github.tomakehurst.wiremock.client.VerificationException: Expected at least one request matching
我想为 API 创建一个存根,并想验证服务器返回的 API 调用和响应。为此,我已经实施了 WireMock
示例:
import org.junit.Rule;
import org.junit.Test;
import com.github.tomakehurst.wiremock.junit.WireMockRule;
public class MockTestDemo {
private static final int WIREMOCK_PORT = 8080;
@Rule
public WireMockRule wireMockRule = new WireMockRule(WIREMOCK_PORT);
@Test
public void exampleTest() {
stubFor(get(urlEqualTo("/login")).withHeader("Accept", equalTo("application/json"))
.willReturn(aResponse().withStatus(200).withBody("Login Success")
.withStatusMessage("Everything was just fine!"))
.willReturn(okJson("{ \"message\": \"Hello\" }")));
verify(getRequestedFor(urlPathEqualTo("http://localhost:8080/login"))
.withHeader("Content-Type",equalTo("application/json"))); }
}
但出现以下错误:
com.github.tomakehurst.wiremock.client.VerificationException: Expected at least one request matching: {
"urlPath" : "localhosturl/login",
"method" : "GET",
"headers" : {
"Content-Type" : {
"equalTo" : "application/json"
}
}
}
Requests received: [ ]
at com.github.tomakehurst.wiremock.client.WireMock.verificationExceptionForNearMisses(WireMock.java:545)
at com.github.tomakehurst.wiremock.client.WireMock.verifyThat(WireMock.java:532)
at com.github.tomakehurst.wiremock.client.WireMock.verifyThat(WireMock.java:511)
at com.github.tomakehurst.wiremock.client.WireMock.verify(WireMock.java:549)
at com.wiremock.test.MockTestDemo.exampleTest(MockTestDemo.java:23)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.junit.runners.model.FrameworkMethod.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at com.github.tomakehurst.wiremock.junit.WireMockRule.evaluate(WireMockRule.java:73)
at org.junit.rules.RunRules.evaluate(RunRules.java:20)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access[=12=]0(ParentRunner.java:58)
at org.junit.runners.ParentRunner.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:538)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:760)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:460)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:206)
如果我评论验证部分然后测试成功执行我也通过调用 http://localhost:8080/login
使用邮递员验证了相同并且它成功返回响应?
我在这里遗漏了什么吗?
在您的代码中,您将对响应进行存根,然后验证是否已对该存根发出请求。但是,您没有调用端点,因此测试失败。
您需要在验证端点被调用之前调用端点。
如果您使用 Apache Commons HttpClient,您可以将测试编写为:
@Test
public void exampleTest() throws Exception {
stubFor(get(urlEqualTo("/login")).withHeader("Accept", equalTo("application/json"))
.willReturn(aResponse().withStatus(200).withBody("Login Success")
.withStatusMessage("Everything was just fine!"))
.willReturn(okJson("{ \"message\": \"Hello\" }")));
String url = "http://localhost:8080/login";
HttpClient client = HttpClientBuilder.create().build();
HttpGet request = new HttpGet(url);
request.addHeader("Content-Type", "application/json");
request.addHeader("Accept", "application/json");
HttpResponse response = client.execute(request);
verify(getRequestedFor(urlPathEqualTo("/login"))
.withHeader("Content-Type", equalTo("application/json")));
}
请使用 class 规则 annotation/field (@ClassRule
) JUnit 4
(在这些情况下,配置可以在多个单元测试中重用).
当 stubs
尚未注册时,@Rule
可能会导致异步或 http 请求上下文出现意外行为。
版本: 2.21.0 -> ... -> 2.31.0
.
注意:在我的特殊情况下,有多个测试重用配置和正确执行的所有请求(调试和检查反序列化到内存中 DTO 的模拟响应)。
然后:
// ... WIREMOCK_PORT
@ClassRule
public static final WireMockClassRule WIRE_MOCK_RULE = new WireMockClassRule(WIREMOCK_PORT); // public
另外,建议验证模拟请求是对 WireMock 注册存根发出的。
步骤:
- 创建存根:
WIRE_MOCK_RULE.stubFor(get(urlPathMatching(...))) // get, post, ...
- 使用 Http 客户端访问模拟端点
- 验证存根已调用:
verify(getRequestedFor(urlPathMatching(...)))
//{get, post, ...}RequestedFor(...) API methods for a particular HTTP request
verify(getRequestedFor(urlPathMatching("a-url-pattern"))); //urlEqualTo, ...
我想为 API 创建一个存根,并想验证服务器返回的 API 调用和响应。为此,我已经实施了 WireMock
示例:
import org.junit.Rule;
import org.junit.Test;
import com.github.tomakehurst.wiremock.junit.WireMockRule;
public class MockTestDemo {
private static final int WIREMOCK_PORT = 8080;
@Rule
public WireMockRule wireMockRule = new WireMockRule(WIREMOCK_PORT);
@Test
public void exampleTest() {
stubFor(get(urlEqualTo("/login")).withHeader("Accept", equalTo("application/json"))
.willReturn(aResponse().withStatus(200).withBody("Login Success")
.withStatusMessage("Everything was just fine!"))
.willReturn(okJson("{ \"message\": \"Hello\" }")));
verify(getRequestedFor(urlPathEqualTo("http://localhost:8080/login"))
.withHeader("Content-Type",equalTo("application/json"))); }
}
但出现以下错误:
com.github.tomakehurst.wiremock.client.VerificationException: Expected at least one request matching: { "urlPath" : "localhosturl/login", "method" : "GET", "headers" : { "Content-Type" : { "equalTo" : "application/json" } } } Requests received: [ ] at com.github.tomakehurst.wiremock.client.WireMock.verificationExceptionForNearMisses(WireMock.java:545) at com.github.tomakehurst.wiremock.client.WireMock.verifyThat(WireMock.java:532) at com.github.tomakehurst.wiremock.client.WireMock.verifyThat(WireMock.java:511) at com.github.tomakehurst.wiremock.client.WireMock.verify(WireMock.java:549) at com.wiremock.test.MockTestDemo.exampleTest(MockTestDemo.java:23) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at org.junit.runners.model.FrameworkMethod.runReflectiveCall(FrameworkMethod.java:50) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) at com.github.tomakehurst.wiremock.junit.WireMockRule.evaluate(WireMockRule.java:73) at org.junit.rules.RunRules.evaluate(RunRules.java:20) at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57) at org.junit.runners.ParentRunner.run(ParentRunner.java:290) at org.junit.runners.ParentRunner.schedule(ParentRunner.java:71) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) at org.junit.runners.ParentRunner.access[=12=]0(ParentRunner.java:58) at org.junit.runners.ParentRunner.evaluate(ParentRunner.java:268) at org.junit.runners.ParentRunner.run(ParentRunner.java:363) at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86) at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:538) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:760) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:460) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:206)
如果我评论验证部分然后测试成功执行我也通过调用 http://localhost:8080/login
使用邮递员验证了相同并且它成功返回响应?
我在这里遗漏了什么吗?
在您的代码中,您将对响应进行存根,然后验证是否已对该存根发出请求。但是,您没有调用端点,因此测试失败。
您需要在验证端点被调用之前调用端点。
如果您使用 Apache Commons HttpClient,您可以将测试编写为:
@Test
public void exampleTest() throws Exception {
stubFor(get(urlEqualTo("/login")).withHeader("Accept", equalTo("application/json"))
.willReturn(aResponse().withStatus(200).withBody("Login Success")
.withStatusMessage("Everything was just fine!"))
.willReturn(okJson("{ \"message\": \"Hello\" }")));
String url = "http://localhost:8080/login";
HttpClient client = HttpClientBuilder.create().build();
HttpGet request = new HttpGet(url);
request.addHeader("Content-Type", "application/json");
request.addHeader("Accept", "application/json");
HttpResponse response = client.execute(request);
verify(getRequestedFor(urlPathEqualTo("/login"))
.withHeader("Content-Type", equalTo("application/json")));
}
请使用 class 规则 annotation/field (@ClassRule
) JUnit 4
(在这些情况下,配置可以在多个单元测试中重用).
stubs
尚未注册时,@Rule
可能会导致异步或 http 请求上下文出现意外行为。
版本: 2.21.0 -> ... -> 2.31.0
.
注意:在我的特殊情况下,有多个测试重用配置和正确执行的所有请求(调试和检查反序列化到内存中 DTO 的模拟响应)。
然后:
// ... WIREMOCK_PORT
@ClassRule
public static final WireMockClassRule WIRE_MOCK_RULE = new WireMockClassRule(WIREMOCK_PORT); // public
另外,建议验证模拟请求是对 WireMock 注册存根发出的。
步骤:
- 创建存根:
WIRE_MOCK_RULE.stubFor(get(urlPathMatching(...))) // get, post, ...
- 使用 Http 客户端访问模拟端点
- 验证存根已调用:
verify(getRequestedFor(urlPathMatching(...)))
//{get, post, ...}RequestedFor(...) API methods for a particular HTTP request
verify(getRequestedFor(urlPathMatching("a-url-pattern"))); //urlEqualTo, ...