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

时间:2014-10-28 05:40:16

标签: java unit-testing mocking mockito

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

class Person {
    private Long id;

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

@Mock Person person;

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

3 个答案:

答案 0 :(得分:7)

这只是默认Mockito答案中原始和包装类型的默认值。

答案 1 :(得分:3)

我遇到了同样的问题,我的解决方案是将模拟的默认答案更改为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);
}

答案 2 :(得分:0)

这是getter方法返回的正确值。

当你在Mokito模拟一个类时,课堂上的所有方法也会被嘲笑。因此,如果将盒装类型属性设置为Null,则无关紧要。当您看到它的LONG值作为实例变量时,其默认值为0L。

因此person.getId()将始终返回0而不是NULL。