【问题标题】:Have Mockito Return Varying Number of Different Values for Invocations让 Mockito 为调用返回不同数量的不同值
【发布时间】:2022-07-14 00:19:55
【问题描述】:

我希望 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 或更好的方法来实现这一点?

【问题讨论】:

  • this answer 适合您吗?应该可以正常使用有序列表。
  • 效果很好。如果您想将其发布为答案,我会接受。

标签: java unit-testing mockito stubbing


【解决方案1】:

Mockito 提供 AdditionalAnswers 类按照这些思路做事,引用 javadocs:

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

这允许对 Mock 响应行为进行更动态的配置。 正如this answer 对类似问题所暗示的那样,AdditionalAnswers.returnsElementsOf​(Collection&lt;?&gt; elements) 可用于为模拟提供将按顺序使用的答案列表。 此处应注意文档中的警告,它将在迭代到结束后自动为所有调用重新使用最后一个元素,因此,如果您想模拟在某个点之后不返回答案,则不会工作。

如果我对文档的理解正确,您还可以通过使用 delegatesTo() 方法将调用中继到您选择的(可能是有状态的)对象来进一步自定义行为,或者使用接受功能接口的 answer() 方法用于提供以有状态方式响应的函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-10
    • 2020-06-13
    • 1970-01-01
    • 2020-10-28
    • 1970-01-01
    相关资源
    最近更新 更多