我们如何替换存根的空隙方法的方法主体?
类似的东西:
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的主体,并将我们的MockFoo变量重置为" Null"由于.when(mockFoo)
和.foo(any())
调用之间的某些怪异原因。
如此有效:
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());
P.S。我们正在使用VertxUnitRunner
进行测试,但是MockitoJUnitRunner
也存在问题。
在注释中解决:
你是对的。在我的实际测试中,我将任何()作为INT的参数提供,这似乎是原因。用Anyint()替换它解决了问题。
这很难警告,因为例外来自Mockito的默认 null
值(由于擦除而需要的)是自动取消框的(由于Java 5 语义而需要的必要),该值不在Mockito的控制之外,并且在Mockito之前知道哪个方法签名您的测试正在尝试致电。这也不是莫科托的例外,甚至是摩有故意调用的例外,因此错误消息很难通过建议进行修改。
对于原始值中的所有使用Mockito Matchers,请使用适当的原始:anyInt
,intThat
等。