Mockito 上的 NullPointerException 验证
NullPointerException on Mockito verify
问题: Mockito 在测试代码语句中抛出 NPE,特别是带有参数匹配器的 verify
调用,除了测试代码行。
执行测试代码时的实际Exception不仅缺乏信息,而且还具有误导性:
java.lang.NullPointerException
at de.example.testing.TmpTest.testSomething(TmpTest.java:31)
非常精简的待测代码示例:
class Medium {
void setLock(boolean locked) {
// do stuff
}
// and other functionality ...
}
测试代码:
@Test
void testSomething() {
// call testing code
verify(_medium, never())
.setLock(any()); // <-- NPE
}
在这个例子中,_medium
是一个有效的 Mock,verify(_medium, never())
的执行也是 returns 一个非空 MockitoMock 实例。
解决方案是:您不能使用any()
来匹配基本类型的参数。
在这种情况下,Mockito 提供 anyBoolean()
,对于所有其他原语。然而,由于 NPE,这并不明显,可能会导致广泛的搜索和令人头疼的问题。
问题: Mockito 在测试代码语句中抛出 NPE,特别是带有参数匹配器的 verify
调用,除了测试代码行。
执行测试代码时的实际Exception不仅缺乏信息,而且还具有误导性:
java.lang.NullPointerException at de.example.testing.TmpTest.testSomething(TmpTest.java:31)
非常精简的待测代码示例:
class Medium {
void setLock(boolean locked) {
// do stuff
}
// and other functionality ...
}
测试代码:
@Test
void testSomething() {
// call testing code
verify(_medium, never())
.setLock(any()); // <-- NPE
}
在这个例子中,_medium
是一个有效的 Mock,verify(_medium, never())
的执行也是 returns 一个非空 MockitoMock 实例。
解决方案是:您不能使用any()
来匹配基本类型的参数。
在这种情况下,Mockito 提供 anyBoolean()
,对于所有其他原语。然而,由于 NPE,这并不明显,可能会导致广泛的搜索和令人头疼的问题。