Java 当从某个方法调用mock时,Wierd mockito InvalidUseOfMatchersException
如果我们模拟自定义接口并直接对其调用someMethod,那么就没有问题了。 但是使用run()会产生以下错误: ========== 线程“main”中出现异常 org.mockito.exceptions.misusing.invalidUseofMatcherException:参数的使用无效 火柴手!预计4名匹配者,1名记录:->在 com.knewton.scratch.Scratch2.main(Scratch2.java:37) 如果匹配器与原始值组合,则可能发生此异常://不正确: someMethod(anyObject(),“原始字符串”);使用匹配器时,所有参数都必须 由matchers提供。例如://correct:someMethod(anyObject(), eq(“匹配器字符串”) 有关更多信息,请参阅javadoc For Matchers类 位于com.knewton.scratch.Scratch2$SomeClass.run(Scratch2.java:24) com.knewton.scratch.Scratch2.main(Scratch2.java:37) ===========Java 当从某个方法调用mock时,Wierd mockito InvalidUseOfMatchersException,java,mockito,Java,Mockito,如果我们模拟自定义接口并直接对其调用someMethod,那么就没有问题了。 但是使用run()会产生以下错误: ========== 线程“main”中出现异常 org.mockito.exceptions.misusing.invalidUseofMatcherException:参数的使用无效 火柴手!预计4名匹配者,1名记录:->在 com.knewton.scratch.Scratch2.main(Scratch2.java:37) 如果匹配器与原始值组合,则可能发生此异常://不正确
这是在mockito 1.9.5上的,下面是我如何处理它的,以及它的怪异之处。这绝对是一个错误
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));
}
}
这就是我是如何处理它的,它很奇怪。这绝对是一个错误
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));
}
}
您在这种情况下使用匹配器是不正确的。所发生的事情是,mockito将记录此匹配器,以便在将来调用mocked方法时使用,在您的情况下,这种情况发生在这里:
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);
}
}
您在这种情况下使用匹配器是不正确的。所发生的事情是,mockito将记录此匹配器,以便在将来调用mocked方法时使用,在您的情况下,这种情况发生在这里:
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);
}
}
不是错误,而是误用。在第37行有
c.run(Mockito.any(Foo.class))代码>其中c不是模拟,因此在下一次调用Custom
的模拟之前会记录此匹配器,因此mockito失败并表示您误用了匹配器。如果您想传递一个伪参数,您应该传递null
或传递Foo
(real或mock)的伪实例,您可以将其放入常数中,以明确它是伪参数。希望有帮助。不是一个bug,而是一个误用。在第37行有c.run(Mockito.any(Foo.class))代码>其中c不是模拟,因此在下一次调用Custom
的模拟之前会记录此匹配器,因此mockito失败并表示您误用了匹配器。如果您想传递一个伪参数,您应该传递null
或传递Foo
(real或mock)的伪实例,您可以将其放入常数中,以明确它是伪参数。希望有帮助。