Áko*_*dra 5 java mocking mockito vert.x
我们如何替换存根的 void 方法的方法体?
像这样的东西:
interface Foo {
void foo(Integer j);
}
(...)
Foo mockFoo = mock(Foo.class);
Answer<Void> ans = invocation -> {
Object[] args = invocation.getArguments();
System.out.println("called with arguments: " + Arrays.toString(args));
return null;
};
when(mockFoo.foo(any())).thenAnswer(ans);
(...)
mockFoo.foo(5) // Should print out "called with arguments: [5]"
Run Code Online (Sandbox Code Playgroud)
能够访问参数并能够执行一些使用这些参数的代码很重要。
我们尝试了doAnswer(ans).when(mockFoo).foo(any());,但它似乎在设置模拟时执行了几次 ans lambda 的主体,并且由于.when(mockFoo)和.foo(any())调用之间的某些奇怪原因,它将我们的 mockFoo 变量重置为“null” 。
如此有效:
Foo mockFoo = mock(Foo.class)
// mockFoo is an instance of a Foo$MockitoMock
Foo o = doAnswer(ans).when(mockFoo);
// mockFoo just became null at this point..?!
o.foo(any());
Run Code Online (Sandbox Code Playgroud)
PS 我们正在使用VertxUnitRunner来运行测试,但问题仍然存在MockitoJUnitRunner。
已在评论中解决:
你是对的。在我的实际测试中,我提供了 any() 作为 int 的参数,这似乎就是原因。将其替换为 anyInt() 解决了问题。
这很难警告,因为异常来自 Mockito 的默认null值(由于擦除而必需)被自动拆箱(由于 Java 5+ 语义而必需),这超出了 Mockito 的控制范围,并且在 Mockito 知道您的测试的方法签名之前正在尝试拨打电话。这也不是 Mockito 异常,甚至不是 Mockito 故意调用的异常,因此错误消息很难通过建议进行修改。
对于原始值中 Mockito 匹配器的所有使用,请使用适当的原始值:anyInt、intThat等。
| 归档时间: |
|
| 查看次数: |
4286 次 |
| 最近记录: |