如何替换存根的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]"
能够访问参数并能够执行一些使用这些参数的代码非常重要。
我们尝试doAnswer(ans).when(mockFoo).foo(any());
,但是在设置模拟时似乎执行了几次ans lambda的主体,并且由于{{1}之间的某些奇怪的原因它将我们的mockFoo变量重置为“null” }和.when(mockFoo)
来电。
如此有效:
.foo(any())
P.S。我们使用VertxUnitRunner来运行测试,但问题仍然存在于MockitoJUnitRunner中。
谢谢, Akos Vandra
答案 0 :(得分:0)
已在评论中解决:
你是对的。在我的实际测试中,我提供了any()作为int的参数,这似乎是原因。用anyInt()替换它可以解决问题。
这很难被警告,因为例外来自Mockito的默认null
值(由于擦除而必需)被自动取消装箱(由于Java 5+语义而必需),这是在...之外Mockito控制并且在Mockito之前知道您的测试试图调用哪种方法签名。这也不是Mockito异常,甚至是Mockito故意调用的异常,因此错误消息很难通过建议进行修改。
对于原始值中Mockito匹配器的所有用法,请使用适当的原语:anyInt
,intThat
,等等。