首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >让Mockito返回不同数量的调用值。

让Mockito返回不同数量的调用值。
EN

Stack Overflow用户
提问于 2022-07-13 13:39:25
回答 1查看 75关注 0票数 0

当在模拟上调用相同的函数时,我希望Mockito模拟一个接一个地返回几个值,并且这些值来自一个列表,而不是将它们写成mock.thenReturn(1).thenReturn(2)

一种方法是滚动我自己的功能:

代码语言:javascript
复制
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或更好的方法来实现这一点?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-07-13 16:19:55

Mockito提供了AdditionalAnswers类来执行这些工作,引用javadocs:

其他答案为答案提供工厂方法。

这允许对模拟响应行为进行更动态的配置。正如这个答案对类似问题所暗示的那样,AdditionalAnswers.returnsElementsOf​(Collection<?> elements)可以用来为模拟提供一个按顺序使用的答案列表。应该注意文档中的警告,在迭代到结束后,将自动对所有调用重复使用最后一个元素,所以如果您想模拟在某个点之后不返回答案,这是行不通的。

如果我正确地理解了文档,您还可以进一步定制行为,方法是使用delegatesTo()方法将调用转发到您选择的(可能有状态)对象,或者使用接受函数接口的answer()方法提供以有状态方式响应的函数。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72967319

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档