当某个对象具有装箱类型属性时,该属性的getter返回0
。但是这应该返回null
,因为装箱类型属性的默认值是null
。这里有什么问题?
class Person {
private Long id;
public Long getId() {
return id;
}
}
...
@Mock Person person;
...
person.getId(); // 0 instead of null
这只是默认Mockito答案中为基元和包装类型选择的默认值。
此0
默认值是在使用null
时选择的,并且太多用户由于开箱而出现NPE,特别是在使用了null
时,新手很难诊断。虽然这可能会让习惯于引用和取消装箱的人感到惊讶,但这种权衡在可用性方面是值得的。
也许有一天,当/如果Java通过反射获得了一个可为null的表示法时,可以重新审视这一点。
不管怎样,如果mockito不适合项目/团队,它允许您更改默认答案。
我遇到了同样的问题,我的解决方案是将mock的默认答案更改为null
:
Person person;
...
person = mock(Person.class, new Answer<Object>() {
@Override
public Object answer(InvocationOnMock invocation) throws Throwable {
return null;
}
});
person.getId(); // null!
(如果您想使用@Mock
注释,不确定是否可以设置默认答案)
如果出于某种原因,您只想设置Long
的默认值(而不是例如Integer
),那么这应该在answer
方法中完成:
if(invocation.getMethod().getReturnType().equals(Long.class)){
return null;
}else{
return Mockito.RETURNS_DEFAULTS.answer(invocation);
}
这是getter方法返回的正确值。
当你在Mokito中嘲笑一个类时,该类中的所有方法也会被嘲笑。因此这与装箱类型属性设置为Null无关。当您看到它的LONG值时,您将其作为默认值为0L的实例变量。
所以person.getId()将始终返回0而不是NULL。