import org.mockito.Mockito;
public class Scratch2 {
public static class Foo {
}
public interface Custom {
public void someMethod(String arg1, String arg2, String arg3,
String arg4);
}
public static class SomeClass {
private final Custom custom;
public SomeClass(Custom c) {
this.custom = c;
}
public boolean run(Foo someFoo) {
custom.someMethod("Dummy", "Dummy", "Dummy", "Dummy");
return false;
}
}
public static void callSomeMethod(Custom custom) {
custom.someMethod("Dummy", "Dummy", "Dummy", "Dummy");
}
public static void main(String[] args) {
Custom mock = Mockito.mock(Custom.class);
SomeClass c = new SomeClass(mock);
callSomeMethod(Mockito.mock(Custom.class));
c.run(Mockito.any(Foo.class));
}
}
如果我们模拟自定义界面并直接调用someMethod就没有问题。 但是使用run()会出现以下错误:
==========
线程“main”中的异常 org.mockito.exceptions.misusing.InvalidUseOfMatchersException:参数的使用无效 匹配器!预计4个匹配器,1个记录: - >在 com.knewton.scratch.Scratch2.main(Scratch2.java:37)
如果匹配器与原始值结合使用可能会发生此异常://错误: someMethod(anyObject(),“raw String”);使用匹配器时,所有参数都必须是 由匹配者提供。例如:// correct:someMethod(anyObject(), eq(“by matcher”));
有关更多信息,请参阅Matchers类的javadoc。
at com.knewton.scratch.Scratch2 $ SomeClass.run(Scratch2.java:24)at at com.knewton.scratch.Scratch2.main(Scratch2.java:37)
===========
这是关于mockito 1.9.5
答案 0 :(得分:1)
在这种情况下,您对匹配器的使用是不正确的。会发生什么事情,mockito将记录此匹配器,以便在将来调用模拟方法时使用,在您的情况下会发生这种情况:
public boolean run(Foo someFoo) {
custom.someMethod("Dummy", "Dummy", "Dummy", "Dummy"); // <- call on mock
return false;
}
mockito计算你使用Mockito.any(Foo.class)
这个方法,现在正确地抱怨你只提供了一个匹配器,但事实上,由于该方法需要4个参数,你需要传递4个匹配器。
不是将匹配器传递给run()
方法,而是应该传递一个真实实例(就像你在自己的答案中所做的那样),或者如果那个对象难以实例化,而你无论如何都不需要它,你可以用mock替换它:
public static void main(String[] args) {
Custom mock = Mockito.mock(Custom.class);
SomeClass c = new SomeClass(mock);
c.run(Mockito.mock(Foo.class));
}
答案 1 :(得分:0)
所以这就是我如何解决它和它的奇怪之处。它肯定是一个错误。
import org.mockito.Mockito;
public class Scratch2 {
public static class Foo {
}
public interface Custom {
public void someMethod(String arg1, String arg2, String arg3,
String arg4);
}
public static class SomeClass {
private final Custom custom;
public SomeClass(Custom c) {
this.custom = c;
}
public boolean run(Foo serviceDiscoveryConfig) {
custom.someMethod("Dummy", "Dummy", "Dummy", "Dummy");
return false;
}
}
public static void main(String[] args) {
Custom mock = Mockito.mock(Custom.class);
SomeClass c = new SomeClass(mock);
Foo foo = new Foo();// HAD TO MAKE A NEW OBJECT HERE!
c.run(foo);
}
}