为什么Mockito的mock在应该返回null的时候返回0?

nzk0hqpo  于 2023-10-18  发布在  其他
关注(0)|答案(3)|浏览(136)

当某个对象具有装箱类型属性时,该属性的getter返回0。但是这应该返回null,因为boxed类型属性的默认值是null。有什么问题吗?

class Person {
    private Long id;

    public Long getId() {
        return id;
    }
}
...

@Mock Person person;

...
person.getId(); // 0 instead of null
eyh26e7m

eyh26e7m1#

这只是在默认的Mockito应答中为基本类型和 Package 器类型选择的默认值。
这个0默认值是在使用null时选择的,当使用null时,由于取消装箱,太多的用户遇到了NPE,特别是对于新手来说,很难诊断。虽然这可能会让习惯引用和取消装箱的人感到惊讶,但这种权衡在可用性方面是值得的。
也许有一天,当/如果Java获得了通过反射可访问的空性符号时,这一点可以重新考虑。
不管怎样,mockito允许你在不适合项目/团队的情况下改变默认答案。

8ehkhllq

8ehkhllq2#

我遇到了同样的问题,我的解决方案是将mock的默认答案更改为null

Person person;

...
person = mock(Person.class, new Answer<Object>() {
  @Override
  public Object answer(InvocationOnMock invocation) throws Throwable {
    return null;
  }
});
person.getId(); // null!

(Not如果你想使用@Mock注解,请确定是否可以设置默认答案)
如果出于某种原因,你只想为Long设置默认值(而不是Integer),这应该可以在answer方法中实现:

if(invocation.getMethod().getReturnType().equals(Long.class)){
  return null;
}else{
  return Mockito.RETURNS_DEFAULTS.answer(invocation);
}
k4emjkb1

k4emjkb13#

这是getter方法返回的正确值。
当你在Mokito中模拟一个类时,类中的所有方法也会被模拟。因此,这与被设置为bottom的boxed type属性无关。正如你看到的,它的LONG值,你有一个示例变量,其默认值是0L。
因此person.getId()将始终返回0而不是NULL。

相关问题