2016-12-14 16 views
1

我们如何替换存根void方法的方法体? 事情是这样的:在mockito中添加虚空方法带有副作用

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拉姆达几次的身体,并为.when(mockFoo).foo(any())调用之间一些奇怪的原因,重置我们mockFoo变量设置为“零”。

那么有效:

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()); 

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

感谢, 阿科什Vandra

+0

请参阅http://stackoverflow.com/questions/2276271/how-to-make-mock-to-void-methods-with-mockito – pringi

+0

你有什么是正确的,并且肯定没有理由说'mockFoo'应该永远重置。您可以向我们展示实际的测试机构设置,而不是您发布的代码段?我有一种感觉,你的问题在那里,而不是你发布的代码。 –

+0

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

回答

0

在评论中解决:

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

这是很难警告,因为异常来自的Mockito的默认null值(由于擦除必要)被自动取消装箱(必要的,因为爪哇5+语义),这是外面的Mockito的控制的和前Mockito知道你的测试正在试图调用哪个方法签名。这也不是Mockito异常,或者甚至是Mockito故意调用的异常,所以错误消息很难通过建议进行修改。

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