繁体   English   中英

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));

}

令人惊讶的是,该测试因以下 output 而失败:

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并且当你使用String any(Integer.class)将被转换为任何 object 时,它会失败,因为你调用它。

此处使用eq()指定参数的最佳方法,如下所示

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

或者使用ArgumentCaptor捕获 arguments 并断言它们

@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()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM