![](/img/trans.png)
[英]Mockito - verify method is called with a specific parameter ( condition )
[英]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....
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.