[英]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.