1
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"); マッチャーを使用する場合、すべての引数はマッチャーによって提供される必要があります。例://正しい:someMethod(anyObject()、eq( "String by matcher"));

詳細については、Matchersクラスのjavadocを参照してください。

com.knewton.scratch.Scratch2 $ SomeClass.run(Scratch2.java:24)でcom.knewton.scratch.Scratch2.main(Scratch2.java:37)で

===========

これはmockito1.9.5にあります

4

2 に答える 2

1

この場合のマッチャーの使用は正しくありません。何が起こるかというと、mockito がこのマッチャーを記録して、モックされたメソッドへの将来の呼び出しで使用することです。あなたの場合は次のようになります。

public boolean run(Foo someFoo) {
    custom.someMethod("Dummy", "Dummy", "Dummy", "Dummy"); // <- call on mock
    return false;
}

mockito は、Mockito.any(Foo.class)このメソッドの の使用をカウントし、マッチャーを 1 つしか提供していないと文句を言うのは当然ですが、実際には、このメソッドには 4 つのパラメーターが必要なため、4 つのマッチャーを渡す必要があります。

メソッドにマッチャーを渡す代わりにrun()、実際のインスタンスを渡す必要があります (自分の回答で行うように)。または、そのオブジェクトをインスタンス化するのが難しく、とにかく必要ない場合は、モックに置き換えることができます。 :

public static void main(String[] args) {
    Custom mock = Mockito.mock(Custom.class);
    SomeClass c = new SomeClass(mock);
    c.run(Mockito.mock(Foo.class));
}
于 2013-01-21T08:11:33.133 に答える
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);
        }
    }
于 2013-01-21T07:58:50.280 に答える