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

Mockito: verify that a method was not called with specific parameter type

我想用 Mockito 测试一个方法没有通过这个简化的特定参数类型调用:

@Test
public void testEm() {
    EntityManager emMock = Mockito.mock(EntityManager.class);
    emMock.persist("test");

    Mockito.verify(emMock, Mockito.never()).persist(Matchers.any(Integer.class));

}

令人惊讶的是这个测试失败了,输出如下:

org.mockito.exceptions.verification.NeverWantedButInvoked: 
entityManager.persist(<any>);
Never wanted here:
-> at com.sg.EmTest.testEm(EmTest.java:21)
But invoked here:
-> at com.sg.EmTest.testEm(EmTest.java:19)

我原以为这个测试只有在使用 Integer 参数调用 persist 方法时才会失败,但使用 String 时它也会失败。

为什么它不起作用,我该如何测试它?

谢谢。

你可以尝试使用not匹配器http://hamcrest.org/JavaHamcrest/javadoc/1.3/org/hamcrest/Matchers.html#not(org.hamcrest.Matcher)

Matchers.not(Matchers.any(Integer.class))

persist() 方法接受一个参数作为 Object 并且当你 select any(Integer.class) 将被转换为任何对象,所以它会失败,因为你调用它使用String.

这里最好的方法是使用eq()指定参数,像这样

Mockito.verify(emMock, Mockito.never()).persist(Matchers.eq(Integer.valueOf(1)));

或使用ArgumentCaptor捕获参数并声明它们

@Test
public void testEm() {
    // Arrange
    EntityManager emMock = Mockito.mock(EntityManager.class);
    ArgumentCaptor<Object> captor =  ArgumentCaptor.forClass(Object.class);  

    // Act
    emMock.persist("test");

    // Assert
    verify(emMock).persit(captor.catpure());
    Object val = captor.getValue();
    Assert....
}

Oracle doc#persist()