为什么 Mockito 的模拟在应该返回 null 时返回 0?



当某个对象具有装箱类型属性时,该属性的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。

相关内容

  • 没有找到相关文章

最新更新