2015-10-14 268 views
6

我有一個具有2個函數的類A: 函數a()返回一個隨機數。函數b()調用一個()並返回返回的值。Mockito when()。thenReturn()無法正常工作

在測試中,我寫了這個:

A test = Mockito.mock(A.class) 
Mockito.when(test.a()).thenReturn(35) 
assertEquals(35,test.a()) 
assertEquals(35,test.b()) 

測試失敗在第二斷言。有誰知道爲什麼?

需要明確的是 - 這不是我真正的代碼,而是一個簡單的代碼來解釋我的問題

回答

16

由於類A被嘲笑,所有的方法調用不會去實際的對象。 這就是爲什麼你的第二個斷言失敗(我想它可能已經返回0)。

解決方案:

你可以做類似

when(test.b()).thenCallRealMethod(); 

你還能spy喜歡

A test = spy(new A()); 
Mockito.when(test.a()).thenReturn(35); 
assertEquals(35,test.a()); 
assertEquals(35,test.b()); 
+1

@SajanChandran謝謝你!這兩種解決方案都可行2個問題:1)對於第一個解決方案,我必須爲類中的每個函數執行CallRealMethod()方法嗎?爲每個函數調用一個()? 2)對於第二種解決方案,「模擬」和「間諜」有什麼區別? – tamird14

+1

是的,如果你想使用任何真正的方法,你必須調用'thenCallRealMethod'並看到這個http://stackoverflow.com/questions/28295625/mockito-spy-vs-mock –

+0

它取決於你基本決定,嘲笑或調用真正的方法 –

3

函數B()的調用()

也許它在你的實際具體的A,但這不是在這種情況下使用。這裏只使用模擬。

所以,你需要告訴模擬什麼你要調用每一個方法做:

Mockito.when(test.b()).thenReturn(35); 
3

因爲你,當你與test.a稱之爲()只有一個模擬。您需要添加Mockito.when(test.b()).thenReturn(35)。那麼你的代碼工作正常

+0

所以,如果我有調用(),並做了與返回的功能價值,我想測試它? a()返回一個隨機數,爲了測試,我希望它返回一個我決定的固定數。我該怎麼做? – tamird14

+0

@ tamird14不能讓你 – Jens

+0

讓我們說我有一個函數b()調用一個(),採取返回的號碼,並返回相反的數字(例如123和321)。我想測試這個功能。問題是我不知道a()會返回什麼,因爲它是隨機的。所以我想讓一個()返回123(例如),所以我可以在測試assertEquals(321,A.b())中寫入。我想測試的功能時,我知道什麼是()在這種特殊情況下 – tamird14