日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Mockito“ thenReturn” vs Mockito“ thenAnswer”

發布時間:2023/12/3 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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方法。

Syntax: OngoingStubbing<T> thenAnswer(Answer<?> answer);

兩者之間的基本區別是thenRetun()將始終返回同一對象。

每當我們調用模擬方法時,thenAnswer方法都會從對象中調用該方法。

我們還可以將函數傳遞給thenRetun()來定義返回值。
當我們使用帶功能的thenAnswer或thenRetun時,可能有兩種情況。

  • 如果函數具有固定的返回值 ,則結果將沒有差異,例如。 thenReturn(getUserName()); 然后Answer(I-> getUserName()); 功能類似
  • 如果根據某些參數在運行時計算返回值 ,則可能會有不同的結果,例如。 thenReturn(getCurrentTime()); 然后Answer(I-> getCurrentTime());
  • (I)函數返回固定值時

    讓我們看下面的示例,我們有一個方法getName()在用戶類中進行測試。
    我們將創建一個UserTest類進行測試。 然后,我們將模擬getName()方法。

    Public class User { public String getName() { return this .name; } } // This is the test class which will test the User class public class UserTest { private String dummyName() { System.out.println( " #dummyName called" ); return "Java" ; } @Test public void thenReturnTest() throws Exception { Tester mock = Mockito.mock(User. class ); ??System.out.println( "------ Using: thenReturn------ " ); Mockito.when(mock.getName()).thenReturn(dummyName()); ??System.out.println( " -- method calls" ); System.out.println( "Call.1 : " + mock.getName()); System.out.println( "Call.2 : " + mock.getName()); } ?? @Test public void thenAnswerTest() throws Exception { Tester mock = Mockito.mock(User. class ); System.out.println( "------ Using: thenAnswer------ " ); Mockito.when(mock.getName()).thenAnswer(i -> dummyName()); System.out.println( " -- method calls" ); System.out.println( "Call.1 : " + mock.getName()); System.out.println( "Call.2 : " + mock.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()方法。

    Public class User { public String getTime() { return this . time ; } } public class UserTest { private String now() { Calendar now = Calendar.getInstance(); return now.get(Calendar.MINUTE) + " : " + now.get(Calendar.SECOND); } private String dummyGetTime() { System.out.println( " #getTime called" ); return now(); } ?? @Test public void thenReturnTest() throws Exception { Tester mock = Mockito.mock(User. class ); ?System.out.println( "------ Using: thenReturn------ " ); Mockito.when(mock.getTime()).thenReturn(dummyGetTime()); ??System.out.println( " -- method calls" ); System.out.println( "Call.1> " + mock.getTime()+ " called at - " +now); " called at - " +now); TimeUnit.SECONDS.sleep(5); System.out.println( "Call.2> " + mock.getTime()+ " called at - " +now); } ?? @Test public void thenAnswerTest() throws Exception { Tester mock = Mockito.mock(User. class ); System.out.println( "------ Using: thenAnswer------ " ); Mockito.when(mock.getTime()).thenAnswer(i -> dummyGetTime()); ??System.out.println( " -- method calls" ); System.out.println( "Call.1> " + mock.getTime()+ " called at : " +now); TimeUnit.SECONDS.sleep(5); System.out.println( "Call.2> " + mock.getTime()+ " called at : " +now); } }

    //輸出:>

    —— 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”的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。