当在模拟上调用相同的函数时,我希望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或更好的方法来实现这一点?
发布于 2022-07-13 16:19:55
Mockito提供了AdditionalAnswers类来执行这些工作,引用javadocs:
其他答案为答案提供工厂方法。
这允许对模拟响应行为进行更动态的配置。正如这个答案对类似问题所暗示的那样,AdditionalAnswers.returnsElementsOf(Collection<?> elements)可以用来为模拟提供一个按顺序使用的答案列表。应该注意文档中的警告,在迭代到结束后,将自动对所有调用重复使用最后一个元素,所以如果您想模拟在某个点之后不返回答案,这是行不通的。
如果我正确地理解了文档,您还可以进一步定制行为,方法是使用delegatesTo()方法将调用转发到您选择的(可能有状态)对象,或者使用接受函数接口的answer()方法提供以有状态方式响应的函数。
https://stackoverflow.com/questions/72967319
复制相似问题