从某种方法调用mock时,怪异的mockito InvalidUseOfMatchersException

时间:2013-01-21 07:52:28

标签: java mockito

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

2 个答案:

答案 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);
        }
    }