2014-10-28 141 views
8

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

class Person { 
    private Long id; 

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

@Mock Person person; 

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

此代码无法编译:getId()方法的返回类型丢失。这很重要,因为如果它是Long,那么默认值(对于未初始化的对象)为null。如果它很长,那么未初始化的longs(primitives)的值是0,但在这种情况下,当尝试解开null Double时,我会期待NullPointerException。但请纠正代码? – Paul 2014-10-28 08:12:19

+0

@保罗哦,谢谢你的发现。固定。 – 2014-10-28 08:20:01

回答

0

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

当你在Mokito中模拟一个类时,该类中的所有方法也会被模拟。所以inheritedly这与盒装类型属性设置为空无关紧要。正如你看到它的LONG值,你有一个实例变量,其默认值为0L。

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

+0

您能否详细解释 – Srinivasu 2014-10-28 06:29:07

5

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

+0

是否有可能使返回值多样化? – 2014-10-28 08:28:43

+0

你可以自定义默认值,当然存根。但我假设你的意思是改变默认答案的默认值,在这种情况下,不是目前没有实现,但是可以改变默认答案。 – Brice 2014-10-28 13:52:43

+2

我期望一个'长'和'0'为'长'' – aliopi 2017-02-21 10:38:45

2

我有同样的问题,我的解决办法是改变模拟的默认答案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); 
}