[英]mockito verifying polymorphic methods
我正在尝试使用Mockito验证对多态方法的调用,并且对前进的最佳方式感到困惑。
示例类
public class Library {
public boolean foo() {
return true;
}
public boolean foo(String s) {
return true;
}
public boolean foo(Integer s) {
return true;
}
}
使用嘲笑的测试类(忽略在LibraryTest
类中, Library
不是被测类,而是我在嘲笑这一事实)
import org.junit.Test;
import static org.junit.Assert.*;
import static org.mockito.Mockito.*;
public class LibraryTest {
@Test public void testFoo1() {
Library mockLibrary = mock(Library.class);
mockLibrary.foo("Hi");
verify(mockLibrary).foo(any());
}
@Test public void testFoo2() {
Library mockLibrary = mock(Library.class);
verify(mockLibrary, never()).foo(any());
}
}
因此,两个verify语句均无法编译,并出现错误“方法foo(String)对于库类型是不明确的”。
错误类型是有道理的, any()
尝试根据参数的类型返回捕获器,但参数可以是Integer
或String
或void
。
我要实现的是,在两个测试中,对任何foo
方法的调用都由verify
计数。 换句话说,第一个verify
调用应该会成功,如果我叫任何foo
方法和第二verify
,如果我调用任何失败了foo
的方法。
有没有办法做到这一点?
您可以使用isA匹配器
verify(mockLibrary).foo(isA(Integer.class));
verify(mockLibrary).foo(isA(String.class));
当您只想查看被测类是否已调用某些方法时,btw使用Mockito.spy而不是Mockito.mock
根据新的操作细节,使用示例进行编辑(几分钟后编写,不用管代码:)。
public static class Library {
public boolean foo() {
return true;
}
public boolean foo(String s) {
return true;
}
public boolean foo(Integer s) {
return true;
}
public String x(){
return "";
}
public void y(){
return;
}
}
public static class ResponseProvider {
public boolean result;
}
@Test
public void testFoo1() {
final ResponseProvider provider = new ResponseProvider();
provider.result = false;
Library lib = Mockito.mock(Library.class, new Answer<Object>() {
@Override
public Object answer(InvocationOnMock invocation) throws Throwable {
if ((invocation.getMethod().getName().equals("foo"))) {
provider.result = true;
return true;
}
return invocation.callRealMethod();
}
});
//lib.foo();
//lib.x();
//lib.y();
assertTrue(provider.result);
}
首先,您要模拟正在测试的同一类。 那不建议,但是仍然
它给出了此异常,因为在foo方法中,mockito不知道您要验证哪个方法。 如果要确保使用正确的值调用调用的方法,则可以使用isA(ClassName)
匹配器,也可以使用ArgumentCaptor。
ArgumentCaptor的示例
@Test public void testFoo1() {
Library mockLibrary = mock(Library.class);
mockLibrary.foo("Hi");
ArgumentCaptor<String> stringCaptor = ArgumentCaptor.forClass(String.class);
verify(mockLibrary).foo(stringCaptor.capture());
String actualArgument = stringCaptor.getValue();
assertEquals(actualArgument, "Hi");
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.