2014-10-28 173 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); 
}