在mockito中使用副作用挖出void方法

时间:2016-12-14 16:44:41

标签: 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]"

能够访问参数并能够执行一些使用这些参数的代码非常重要。

我们尝试doAnswer(ans).when(mockFoo).foo(any());,但是在设置模拟时似乎执行了几次ans lambda的主体,并且由于{{1}之间的某些奇怪的原因它将我们的mockFoo变量重置为“null” }和.when(mockFoo)来电。

如此有效:

.foo(any())

P.S。我们使用VertxUnitRunner来运行测试,但问题仍然存在于MockitoJUnitRunner中。

谢谢,   Akos Vandra

1 个答案:

答案 0 :(得分:0)

已在评论中解决:

  

你是对的。在我的实际测试中,我提供了any()作为int的参数,这似乎是原因。用anyInt()替换它可以解决问题。

这很难被警告,因为例外来自Mockito的默认null值(由于擦除而必需)被自动取消装箱(由于Java 5+语义而必需),这是在...之外Mockito控制并且在Mockito之前知道您的测试试图调用哪种方法签名。这也不是Mockito异常,甚至是Mockito故意调用的异常,因此错误消息很难通过建议进行修改。

对于原始值中Mockito匹配器的所有用法,请使用适当的原语:anyIntintThat,等等。