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....
}
我想用 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....
}