- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我想为 API 创建一个 stub ,并想验证服务器返回的 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$1.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$1.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$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.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
使用 postman 验证了相同的部分并且它成功返回响应?
我在这里遗漏了什么吗?
最佳答案
在您的代码中,您将对响应进行 stub ,然后验证是否已对该 stub 发出请求。但是,您没有调用端点,因此测试失败。
您需要先调用端点,然后再验证它是否被调用。
如果您使用 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")));
}
关于java - com.github.tomakehurst.wiremock.client.VerificationException : Expected at least one request matching,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50539505/
每当我在附加调试器的情况下运行以下任一单元测试时,我都会在 FluentValidation 中得到一个 VerificationException此时的代码(如有必要,稍后将发布整个堆栈跟踪): a
我使用 .Net 4.5.2 和 Entity Framework 6.1.3 创建了一个基本的 WCF 数据服务和 Entity Framework。数据库中只有一张表。 配置如下: public
为什么此代码会抛出“System.Security.VerificationException:操作可能会破坏运行时的稳定性。”? MethodInfo mi = typeof(TypedRefere
我读过这个post我想使用 ControllerExtensions.RedirectToAction 方法。但是我有 System.Security.VerificationException 说:
我正在使用 IL 生成创建一个简单的反序列化器方法,该方法从 Lucene 文档中提取字符串并设置引用类型对象 (POCO) 的属性或字段。 每当我尝试运行生成的方法时,我都会收到 Verificat
我收到“操作可能会破坏运行时异常”。我瞪大了眼睛,看起来异常与在运行时加载的冲突程序集有关。所以,这里有几件事 相同的源代码在我同事的机器上运行。 我查看并搜索了对 NewtonSoft.Json.d
似乎当我使用 OpenCover 检测程序集时, 组件与 SecurityTransparent属性(似乎还有 AllowPartiallyTrustedCallers)将抛出 Verificatio
我正在制作一个声音合成程序,用户可以在其中通过基于节点的合成、创建振荡器、滤波器等来创建自己的声音。 程序将节点编译成中间语言,然后通过 ILGenerator 和 DynamicMethod 将其转
我需要在运行时使用 TypeBuilder 创建一个类型。这种类型应该实现一个特定的接口(interface),以便可以在编译时统一处理这种动态类型的实例。 该接口(interface)应返回一个对象
我正在将我的一个项目从 VS2008 迁移到 VS2010。现在,当我运行测试工具时,我将解决方案中的所有项目都转换为 .NET 4.0(客户端配置文件),几乎所有测试都失败了,但出现以下异常: Sy
帮帮我,为什么这段代码在 .NET 4.0 下运行时会导致 VerificationException? public T parseEnum(string value, T defaultValu
我正在使用 FluentValidation 3.4.6,我的项目的目标框架是 .net 4。我已经彻底检查了我的解决方案,以确保没有引用旧版本的 FluentValidation。 我相信这个版本的
在尝试重构 MVC 4 应用程序期间,我的代码出现了这样的扭曲,我从 Subversion 恢复了整个东西。但是,现在,当我运行代码时出现以下异常,并且无法弄清楚如何消除它。 Server Error
我想通过委托(delegate)调用某些方法,但得到了 VerificationException。我正在使用以下代码: internal delegate void Delegete_add
我遇到了 MVC3 RC 的奇怪行为。 我使用单元测试创建了默认的 Internet 应用程序,并且我的计算机上的所有单元测试都失败了。所有测试都有错误"System.Security.Verif
我正在开发一个 Android 应用程序,它使用我的 REST 后端。后端在 JBoss 实例上运行,该实例通过 Keycloak 进行保护。自从我将 Keycloak 从 1.0.7 更新到 2.1
我试图在事件发生时触发一个 Action ,忽略事件参数(至少现在)。我通过反射找到事件,然后创建一个匹配预期签名的动态方法(不能保证它只是发件人/EventArgs) 并从那里尝试调用该操作。 //
我有一个将构造函数包装在动态工厂方法中的方法: static Func ToFactoryMethod(this ConstructorInfo ctor) where TResult : c
我最近尝试将一个由 SubSonic 2.2 生成 DAL 的 .net 2.0 项目升级到 Visual Studio 2010 下的 .NET 4.0。 项目转换没有错误,但现在我在尝试启动它时收
我有类似的代码 using FluentValidation; public class FreeformValidator : AbstractValidator { public Free
我是一名优秀的程序员,十分优秀!