验证使用Mockito.inOrder以正确的顺序调用了模拟方法

人体模型:

我正在尝试在模拟对象上按预期顺序调用方法。下面是简化的示例:

@Test
public void test() {
    List<String> mockedList = Mockito.mock(List.class);

    for (int i = 0; i < 5; i++) {
        mockedList.add("a");
        mockedList.add("b");
        mockedList.add("c");
    }

    // I want only this to pass.
    InOrder inOrder1 = Mockito.inOrder(mockedList);
    inOrder1.verify(mockedList).add("a");
    inOrder1.verify(mockedList).add("b");
    inOrder1.verify(mockedList).add("c");

    // I want this to fail.
    InOrder inOrder2 = Mockito.inOrder(mockedList);
    inOrder2.verify(mockedList).add("c");
    inOrder2.verify(mockedList).add("b");
    inOrder2.verify(mockedList).add("a");
}

尽管验证顺序(c -> b -> a)与调用顺序(a -> b -> c)不同,但是此测试通过了。这是因为Mockito会验证method2是否在method1 之后的任何位置调用,但不是立即调用(即,在两者之间没有其他方法调用)。当我多次添加元素时,这很有可能。这意味着Mockito InOrder传递给b -> a -> c -> a -> c -> b -> c -> b -> a ...

但我希望此操作失败,并确保订单始终 a -> b -> c -> a -> b -> c -> a -> b -> c ...

更新:正确的验证方法是验证订单的迭代次数是否相同(已接受答案的摘要)

for (int i = 0; i < 5; i++) {
    inOrder1.verify(mockedList).add("a");
    inOrder1.verify(mockedList).add("b");
    inOrder1.verify(mockedList).add("c");
}

// fail the test if we missed to verify any other invocations
inOrder1.verifyNoMoreInteractions();
胸罩:

问题是您需要添加

inOrder.verifyNoMoreInteractions();

通过循环,您可以生成类似

  • 加(a)
  • 加(b)
  • 加(c)
  • 加(a)
  • 加(b)
  • 加(c)

当您再检查

inOrder.verify(mockedList).add("b");
inOrder.verify(mockedList).add("c");
inOrder.verify(mockedList).add("a");

它与调用(add(b),add(c),add(a))匹配。不检查其他呼叫。

  • 加(a)
  • 加(b)
  • 加(c)
  • 加(a)
  • 加(b)
  • 加(c)

因此,我认为您必须选择:1)验证所有调用a,b,c,a,b,c 2)验证模拟不再发生任何交互

顺便说一句,如果您将验证更改为

inOrder.verify(mockedList).add("c");
inOrder.verify(mockedList).add("b");
inOrder.verify(mockedList).add("a");

它会失败,因为它与呼叫不匹配:-)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用 Mockito 验证在模拟对象上调用了 setter

验证的多种方法调用使用的的Mockito顺序

使用 Mockito 验证静态方法调用

如何使用 Mockito 验证最终方法的执行?

Mockito验证方法调用的顺序/顺序

如何使用 Mockito 使用枚举参数验证方法调用?

如何使用Mockito模拟和验证方法中的回调

如何验证使用Mockito调用了两种方法之一?

如何使用Mockito验证未使用任何参数组合调用的模拟方法

Mockito:验证使用功能参数调用方法

Mockito:验证未使用特定参数类型调用方法

使用Mockito验证方法后没有调用任何内容

如何验证未使用Mockito调用特定方法?

如何使用Power Mockito调用如何验证静态void方法

是否可以使用Mockito验证测试的对象方法调用?

Mockito验证使用正则表达式使用正确的参数调用方法

Groovy:使用验证(和内联模拟)的Mockito UnfinishedStubbingException

如何使用Mockito验证Kotlin中的setter调用?

Mockito:使用类型兼容的参数验证重载方法

测试是否使用Mockito调用了方法

如何使用 Mockito 验证在测试期间调用了 SUT 的另一个公共方法

Mockito 验证异步方法

Mockito,方法验证的任务

使用JQuery顺序调用Javascript文件

Rxjs使用concatMap进行顺序调用

如何使用 $q 顺序调用承诺

Mockito可以验证模拟对象上的方法调用总数吗?

Mockito在调用方法之前验证模拟中设置的变量

模拟嵌套方法调用使用的Mockito