2013-05-19 165 views
1

我看着在論壇,但找不到爲什麼會發生這種事方法的Mockito返回null

public class AImpl implements A{ 

    @Autowired 
    B bImpl; 

    protected void doSomething(){ 
     String s = "test"; 
     String d = b.permuteString(s); 
     System.out.println(s.substring(1)); 
    } 

} 

public class BImpl implements B{ 
    public String permuateString(s){ 
    return s; 
    } 
} 

在測試中我有:

@InjectMocks 
AImpl aImpl; 

@Mock 
BImpl bImpl; 

@Test 
public void testCode(){ 
testCode(){ 
    aImpl.doSomething(); 
} 
} 

的方法permuateStringBImpl總是返回null。我需要知道permuteString()的結果才能繼續執行doSomething。所以它不能爲空

爲什麼?

我使用Mockito

+0

什麼值是B B;分配? – LanternMike

+0

如果未分配'B b',b.permuateString(s)'應拋出'NullPointerException'。 –

+0

對不起,我的意思是b是bImpl,它是自動裝配的。我在調試testng時發現它不爲空 – Dejell

回答

4

通過與@Mock註解BImpl場,你說的實例本身應該是一個模擬。然而,你並沒有告訴Mockito當用參數調用時模擬應該給出的結果,所以Mockito使用它的默認行爲返回null。

事實上,BImpl是一個真實的類與真實行爲是無關緊要的。該字段不包含該類的實例;它包含一個模擬實例。

在您的測試方法,你叫aImpl.doSomething()之前,告訴的Mockito你期望它使用的行爲:

when(bImpl.permuteString("test")).thenReturn("someOtherValue"); 
+0

如果將bImpl參數(「測試」)作爲a.doSomething()的一部分進行計算,我無法事先預測該怎麼辦? – Dejell

+0

@Odelya考慮你想要測試的是:AImpl的行爲,以及它如何與它的依賴關係進行交互。B.如果你關心的是AImpl給出了B類* something *,然後在Mockito中使用verify()以確保它被稱爲。 – GaryF

+0

讓我解釋更多。 A是發送電子郵件的類。 B是一個知道檢索HTML(它是在A中創建的)並將其轉換爲圖像的類,所以A會通過電子郵件發送它。當A檢索結果時,它會旋轉圖像並將其保存到磁盤。所以我需要B來執行。 – Dejell

0

有可能的,B實例爲@Autowired到您的AImpl實例也是一個模擬的(不管它是一個模擬B或模擬BImpl,我不知道)。

在任何一種情況下,任何模擬的默認存根方法可能會返回null,除非您另有說明(除非您的文檔爲stub)。

我不能肯定(除非我跑我自己的測試),但我可以說,它會幫助你簡單的添加記錄語句(或使用調試器),以驗證是否:

一)AImpl#b包含什麼值(是BImpl還是模擬B)?

b。)是否調用BImpl#permuateString()。 。

C)BImpl#permuateString()將獲取s

+0

A)我解決了我的錯誤。 AImpl包含B的模擬,它是bImpl(參見測試 - 我聲明它爲模擬並注入它)。 B)在調用doSomething時C)我不能提前知道。這與測試無關,但結果不應爲空 – Dejell