Java 当从某个方法调用mock时,Wierd mockito InvalidUseOfMatchersException

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) 如果匹配器与原始值组合,则可能发生此异常://不正确

如果我们模拟自定义接口并直接对其调用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)

===========


这是在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)的伪实例,您可以将其放入常数中,以明确它是伪参数。希望有帮助。