1

モックに対する呼び出しは、予想される引数値でのみ発生し、他の値では発生しないことを確認したいと思います。

public interface ADependancy {
    public void method(String parameter, String otherParameter);
}


public class Foo {
    private ADependancy myHelper;

    public Foo(ADependancy helper) {
        this.myHelper = helper;
    }

    public void good() {
        myHelper.method("expected","expected");
        myHelper.method("expected","expected");
        myHelper.method("expected","expected");
    }

    public void bad() {
        myHelper.method("expected","expected");
        myHelper.method("expected","UNexpected");
        myHelper.method("expected","expected");
    }
}

私はこれを試しました:

public class FooTest extends TestCase {
    private ADependancy mock =mock(ADependancy.class);;
    private Foo foo  = new Foo(mock);

    @Test
    public void testGood() {
        foo.good();
        validateOnlyCalledWithExpected();
    }

    @Test
    public void testBad() {
        foo.bad();
        validateOnlyCalledWithExpected();
    }

    private void validateOnlyCalledWithExpected() {
        verify(mock,atLeastOnce()).method(eq("expected"),eq("expected"));
        verify(mock,never()).method(not(eq("expected")),not(eq("expected")));
    }
}

testBadが失敗することを期待していますが、代わりにテストに合格しています。メソッドが1つのパラメーターのみを取る場合、これは期待どおりに機能します。

4

2 に答える 2

4

それは論理的な間違いでした。

私は、各引数が期待値以外の何物でもないことを主張したかったのです。しかし、代わりに、私が実際に主張していたのは、それらがすべて期待値ではないということは決して起こらないということでした。したがって、私が持っていた方法では、実際には一部の引数が期待値ではないため、期待どおりに失敗しませんでした。したがって、期待値ではないすべてのパラメーターを使用してメソッド呼び出されることはなく、検証に合格します。

したがって、これは私が望んでいたものに対して機能します:

    private void validateOnlyCalledWithExpected() {
        verify(mock,atLeastOnce()).method(eq("expected"),eq("expected"));
        verify(mock,never()).method(not(eq("expected")),anyString());
        verify(mock,never()).method(anyString(),not(eq("expected")));
    }
于 2012-12-24T17:50:07.150 に答える
4

http://docs.mockito.googlecode.com/hg/latest/org/mockito/Mockito.html#finding_redundant_invocationsverifyNoMoreInteractionsに記載されている静的メソッドを使用できます。

verify(mock).method(eq("expected"),eq("expected"));
verifyNoMoreInteractions(mock);

または、次のように書くこともできます

verify(mock).method(eq("expected"),eq("expected"));
verify(mock,never()).method(anyString(),anyString());

2回目の呼び出しverifyでは、すでに確認済みの呼び出しが無視されるためです。

于 2012-12-24T22:24:16.437 に答える