Mockito“ thenReturn” vs Mockito“ thenAnswer”
在編寫代碼測試用例時,Mockito是開發人員最常見的選擇之一。 然后我們面對的問題是,如何使用Mockito的thenReturn()和thenAnswer()方法? 如果您也面臨這個問題,請不要擔心每個人都面臨或已經遇到了這個問題,我們將在這里解決!! 所以,開始吧...
Mockito是最著名的測試模擬框架之一。 讓我們假設您已經了解了模仿。 如果沒有,您可以在我們繼續之前訪問官方的Mockito網站 。
在調用真實方法的Mockito方法中,您可以指定調用該方法時要返回的內容或執行的操作。 這稱為“模擬”。 有多種方法可以指定模擬行為。 最常見的方法是使用thenReturn()和thenAnswer()方法。
大多數時候,使用thenReturn ()(很好),但有時我們需要使用thenAnswer ()。
什么時候應該使用thenReturn,什么時候可以回答?
最簡單的答案是–如果在方法調用中需要固定的返回值,則應使用thenReturn(…)。 如果需要執行某些操作或需要在運行時計算值,則應使用thenAnswer(…)
讓我們看看例子
假設我們需要在getName()方法調用中返回字符串值“ Mockito”。
Mockito.when(mock.getName() ).thenReturn(“Mockito”)如果在調用getCurrentTime方法時需要返回系統時間,則需要
Mockito.when (mock.getCurrentTime() ).thenAnswer(I -> new Date() );現在讓我們詳細介紹
方法thenReturn()需要一個固定的對象,該對象將在我們調用該方法時返回。 我們可以傳遞任何類型的對象或值,方法調用將返回相同的值。
Syntax: OngoingStubbing<T> thenReturn(T value); thenAnswer方法需要實現接口org.mockito.stubbing.Answer的類的對象。
Answer是具有方法answer(..)的功能接口。 當我們從模擬對象中調用模擬方法時,將調用answer()方法。
我們可以使用Java 8 lambda功能來實現answer方法。
兩者之間的基本區別是thenRetun()將始終返回同一對象。
每當我們調用模擬方法時,thenAnswer方法都會從對象中調用該方法。
我們還可以將函數傳遞給thenRetun()來定義返回值。
當我們使用帶功能的thenAnswer或thenRetun時,可能有兩種情況。
(I)函數返回固定值時
讓我們看下面的示例,我們有一個方法getName()在用戶類中進行測試。
我們將創建一個UserTest類進行測試。 然后,我們將模擬getName()方法。
//輸出:
—— Using: thenReturn—— — #dummyName called — method calls Call.1 : Java Call.2 : Java—— Using: thenAnswer—— — method calls — #dummyName called Call.1 : Java — #dummyName called Call.2 : Java 在上面的示例中,我們可以看到在兩種情況下getName()方法都返回相同的值。 但是,打印的消息是不同的。
如果使用thenRetun() ,請在實際調用之前執行 dummyName() 方法 。
這是因為如上所述,那么thenReturn()需要值,因此在初始化時將執行它并使用返回值。
如果thenAnswer(),則#dummyName調用也會打印兩次。 這是因為每次我們調用模擬方法時,都會執行該函數。
(II)在運行時計算返回值
讓我們看下面的示例,我們有一個方法getTime()在用戶類中進行測試。
我們將創建一個UserTest類進行測試。 然后將模擬getTime()方法。
//輸出:>
—— Using: thenReturn—— — #getTime called — method calls Call.1> 4 : 22 called at- 4 : 22 Call.2> 4 : 22 called at- 4 : 27—— Using: thenAnswer—— — method calls — #getTime called Call.1> 4 : 22 called at- 4 : 22 — #getTime called Call.2> 4 : 27 called at- 4 : 27 在上面的示例中,我們可以看到,在thenAnswer()情況下,getTime()方法返回不同的值,而在thenRetun()情況下,返回相同的值。
在thenRetun()的情況下,該值是從now()方法(即4:22)計算得出的。 每次調用getTime()函數時,thenReturn()方法中都會使用此值。
在thenAnswer()的情況下,每次我們調用模擬方法getTime()時,也會調用now()方法并返回新值。
績效影響
如果該方法返回簡單的固定值,我們可能看不到任何性能差異。 但是,如果該方法具有數據庫或網絡調用,則可能會有很大的性能差異。
如果value是固定的,那么我們最好使用thenReturn(),因為它只會執行一次。
結論
我們可以得出結論,thenReturn()始終返回相同的值,而thenAnswer()返回實時計算的值。
快速閱讀
- 如果在方法調用中需要固定的返回值,則應使用thenReturn(...)
- 如果在運行時計算值,則應使用thenAnswer(...)
- thenReturn(T value)方法需要固定值,該值將返回
- thenAnswer(Answer <T> answer)需要Answer接口的實例,該接口的answer()方法每次都被調用
- 對于固定的返回值,則可以使用Return()
翻譯自: https://www.javacodegeeks.com/2020/05/mockito-thenreturn-vs-mockito-thenanswer.html
總結
以上是生活随笔為你收集整理的Mockito“ thenReturn” vs Mockito“ thenAnswer”的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用Java 8.0进行类型安全的依赖注
- 下一篇: 如何在黄瓜中进行后端测试