簡體   English   中英

讓 Mockito 為調用返回不同數量的不同值

[英]Have Mockito Return Varying Number of Different Values for Invocations

當在模擬上調用相同的函數時,我希望 Mockito 模擬一個接一個地返回多個值,並讓這些值來自一個列表,而不是通過將它們寫成mock.thenReturn(1).thenReturn(2)

一種方法是滾動我自己的函數:

class  A{
    public  int getVal() {return 0;}
}

class OneTest {

    static void makeMockReturnSomeObjects(A mock, List<Integer> returnValues ) {
        OngoingStubbing<Integer> stubbing = Mockito.when(mock.getVal());
        for (Integer integer : returnValues) {
            stubbing = stubbing.thenReturn(integer);
        }
        
    }
    @Test
    void test() {
        A mock = Mockito.mock(A.class);
        makeMockReturnSomeObjects(mock, List.of(1,2,3));
        System.out.println(mock.getVal()); // prints 1
        System.out.println(mock.getVal()); // prints 2
        System.out.println(mock.getVal()); // prints 3
    }

}

是否有內置的 api 或更好的方法來實現這一點?

Mockito 提供AdditionalAnswers類來做這些事情,引用 javadocs:

附加答案提供了答案的工廠方法

這允許對 Mock 響應行為進行更動態的配置。 正如對類似問題的回答所暗示的那樣, AdditionalAnswers.returnsElementsOf​(Collection<?> elements)可用於為模擬提供將按順序使用的答案列表。 此處應注意文檔中的警告,它會在迭代到結束后自動為所有調用重新使用最后一個元素,因此如果您想模擬在某個點之后不返回答案,這將不起作用。

如果我正確理解文檔,您還可以通過使用delegatesTo()方法將調用中繼到您選擇的(可能有狀態的)對象來進一步自定義行為,或者使用接受功能接口的answer()方法來提供以有狀態方式響應的函數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM