试图弄清楚如何为原始值编写自定义匹配器。假设我有以下自定义匹配器:
class IsEven extends ArgumentMatcher<Integer> {
public boolean matches(Object i) {
return ((Integer) i) % 2 == 0;
}
}
我运行以下测试。 'mocked'是一个已经被模拟的类的实例,它有一个方法'someMethod':
@Test
public void primatives() {
mocked.someMethod(2);
ArgumentMatcher<Integer> customMatcher = new IsEven();
// ! Throws NPE !
Mockito.verify(mocked).someMethod(Mockito.argThat(customMatcher));
}
NullPointerException的原因是Mockio.argThat方法总是返回一个null,我猜测它不能自动装回一个整数。
我觉得这个问题好像是一个常见的用例 - 有什么建议吗?
谢谢, 罗伊
答案 0 :(得分:7)
..阅读Javadoc有帮助:
在极少数情况下,当参数是基元时,必须使用相关的intThat(),floatThat()等方法。这样,您将在自动装箱期间避免NullPointerException。
答案 1 :(得分:0)
对于任何方法,您可以使用doThrow(),doAnswer(),doNothing(),doReturn()和doCallRealMethod()来代替使用when()的相应调用。
时有必要stub void方法 间谍对象的存根方法(见下文) 多次使用相同的方法,在测试过程中更改模拟的行为。 但对于所有的存根调用,您可能更愿意使用这些方法代替when()的替代方法。
when(mock.foo()).thenThrow(new RuntimeException());
//Impossible: the exception-stubbed foo() method is called so RuntimeException is thrown.
when(mock.foo()).thenReturn("bar");
//You have to use doReturn() for stubbing:
doReturn("bar").when(mock).foo();