Mockito 验证仍然无法使用所有匹配器

Mockito verify still fails on using all Matchers

我最近正在写一个 JUnit 测试,我承认 Mockito 要么需要所有原始值,要么使用所有匹配器,但我发现以下情况对于所有匹配器仍然失败,错误消息是:

Invalid use of argument matchers! 0 matchers expected, 1 recorded:

我进行了一些测试,它看起来与使用存根方法作为 eq() 匹配器的值有关。请参阅下面的示例:

我有一个Class一个很简单

public class A {

    public void testMockitoMatcher(double a, String b){

    }
}

这是我的测试用例

import org.junit.Test;

import static org.mockito.Mockito.*;

public class SomeUnitTest {
    private A mockA = mock(A.class);

    @Test
    public void allMatchersDoesntWork() {
        Object mockObject = mock(Object.class);
        String someString = "Just some mocked String value to return";
        when(mockObject.toString()).thenReturn(someString);

        mockA.testMockitoMatcher(1312d, mockObject.toString());

        verify(mockA, times(1)).testMockitoMatcher(anyDouble(), eq(someString));    //<- This works
        verify(mockA, times(1)).testMockitoMatcher(anyDouble(), eq(mockObject.toString()));    //<- This doesn't by using stub method toString() to return the String value as param to eq()
    }
}

我还在第二个验证语句中使用调试验证 mockObject.toString() 仍然可以 return 我的存根值。两者都验证使用所有匹配器,为什么 mockito 在第二次验证时仍然只给我记录了 1 个匹配器而不是 2 个匹配器?

谢谢!

Mockito 希望您的测试分三个阶段进行。

  • 您为测试设置了东西,包括打桩任何需要打桩的方法(“安排”阶段)。
  • 您 运行 您尝试测试的实际方法(“行动”阶段)。
  • 您对测试的输出做出断言,可能包括验证在您的模拟中调用了哪些方法(“断言”阶段)。

您需要按此顺序执行这三件事,因为 Mockito 会跟踪您是在进行存根、验证还是其他操作。它还有自己的内部堆栈,用于存储匹配器,用于存根或验证。

在您的示例中的第二个 verify 调用中,对 anyDouble() 的调用将 Matcher 放入堆栈。但这会为 mockObject.toString().

的调用创建一个无效状态

不要这样做。一旦您准备好 运行 您的断言和验证,您不应该再调用存根方法。将每个测试的“安排”、“执行”和“断言”阶段彼此完全分开。