【问题标题】:How to get the number of times a mock is called in Mockito如何获取在 Mockito 中调用模拟的次数
【发布时间】:2015-06-06 20:18:51
【问题描述】:

我正在使用 PowerMockito 和 Mockito 来模拟一些静态类。我想获取在运行时调用特定模拟对象的次数,以便我可以将该计数用于另一个模拟对象的验证时间。

我需要这个,因为我正在测试的方法会启动一个线程并在一秒钟后停止该线程。我的模拟在这 1 秒内被多次调用。调用第一个mock后,可以调用代码分支和不同的mock。所以,我想将第一个模拟的数量与其他模拟的数量进行比较。

这是旧代码。所以我不能对实际代码进行更改。我只能更改测试代码。

【问题讨论】:

    标签: unit-testing junit mockito powermock powermockito


    【解决方案1】:

    可能有一个更简单的解决方案,因为 Mockito 已经让您能够使用 Mockito.verify() 验证特定模拟的调用次数,但我还没有找到任何方法来返回该计数,因此您可以使用答案并实施你自己的柜台:

    MyClass myObject = mock(MyClass.class);
    final int counter = 0;
    
    when(myObject.myMethod()).then(new Answer<Result>() {
        @Override
        public Result answer(InvocationOnMock invocation) throws Throwable {
            counter++;
            return result;
        }
    }); 
    

    这个解决方案的问题是你需要为你要模拟的每个方法编写上面的代码。


    Mockito 1.10+:

    其实经过1.10版本的API我发现:

    Mockito.mockingDetails(mock).getInvocations();
    

    【讨论】:

    • getInvocations() 在某些情况下给出了错误的值。可能是模拟调用值在读取时尚未更新。在阅读 getInvocations 之前,我必须先睡一会,但睡眠是我想在测试中写的最后一件事。
    • @TechCrunch 在这种情况下,我能提出的唯一解决方案是我在上面发布的解决方案或某种 AOP,但我认为这太过分了
    • @TechCrunch 您能否粘贴显示 getInvocations() 何时给出错误值的代码?
    • 我可以使用 getInvocations().size() 检查调用是否为 == 1。
    • 有没有办法使用 mockingDetails.getInvocations 来确定在 mock/spy 上调用具有某些参数的函数的次数?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多