首页 > 解决方案 > 我可以操纵模拟匹配器的顺序吗?

问题描述

一些背景

在设置模拟(when)或验证模拟调用(verify)时,Mockito 要求您提供模拟方法所需的所有具体值,或者为所有这些提供匹配器。无法混合使用这些样式。

when(mock.method(1, 2, 3));
when(mock.method(eq(1), eq(2), eq(3)));

我说的是第二种风格。

由于 Mockito 的工作方式,调用匹配器的顺序很重要。在内部,Mockito 将在堆栈上注册匹配器,并在必要时按顺序执行它们。

我试图达到的目标

我想编写一些与 mockito 一起使用的测试实用程序。我希望这些实用方法将调用委托给模拟,插入一些默认匹配器,否则这些匹配器将是样板测试代码。

例如:

public String callOnMock(int argument2) {
    return mock.call(eq(1), argument2, argThat(i -> i >= 3));
}

这将像这样使用:

when(callOnMock(eq(2)).thenReturn("result");

问题

这不起作用,因为 Mockito 以错误的顺序注册了这些匹配器:

  1. eq(2)
  2. eq(1)
  3. argThat(i -> i >= 3)

虽然它应该是

  1. eq(1)
  2. eq(2)
  3. argThat(i -> i >= 3)

有没有办法让我操纵这些匹配器的注册顺序?

我现在org.mockito.AdditionalMatchers拥有操纵内部堆栈以允许组合匹配器的方法(and, or, not),因此至少在 Mockito 核心内部是可能的。

是否也可以显式地弹出和推送匹配器?

标签: mockitomatcher

解决方案


使用Supplier

public String callOnMock(Supplier<Integer> argument2) {
    return mock.call(eq(1), argument2.get(), argThat(i -> i >= 3));
}

when(callOnMock(() -> eq(2)).thenReturn("result");

推荐阅读