51

Mockitoを使用してJavaで単体テストを記述していますが、特定のメソッドがオブジェクトで最後に呼び出されるメソッドであることを確認したいと思います。

私はテスト中のコードで次のようなことをしています:

row.setSomething(value);
row.setSomethingElse(anotherValue);
row.editABunchMoreStuff();
row.saveToDatabase();

私のモックでは、行のすべてを編集する順序は気にしませんが、保存した後でそれ以上何もしようとしないことが非常に重要です。これを行う良い方法はありますか?

私はverifyNoMoreInteractionsを探していないことに注意してください。saveToDatabaseが最後に呼び出されたことを確認しません。また、明示的に検証していない行の何かを呼び出すと失敗します。私は次のようなことを言うことができるようにしたいと思います:

verify(row).setSomething(value);
verify(row).setSomethingElse(anotherValue);
verifyTheLastThingCalledOn(row).saveToDatabase();

それが役に立ったら、私はこれを行ったJMockテストからMockitoに切り替えています:

row.expects(once()).method("saveToDatabase").id("save");
row.expects(never()).method(ANYTHING).after("save");
4

3 に答える 3

59

よりカスタム作業が必要になると思います。

verify(row, new LastCall()).saveToDatabase();

その後

public class LastCall implements VerificationMode {
    public void verify(VerificationData data) {
        List<Invocation> invocations = data.getAllInvocations();
        InvocationMatcher matcher = data.getWanted();
        Invocation invocation = invocations.get(invocations.size() - 1);
        if (!matcher.matches(invocation)) throw new MockitoException("...");
    }
}

前の回答:

あなたが正しいです。verifyNoMoreInteractions が必要です。

verify(row).setSomething(value);
verify(row).setSomethingElse(anotherValue);
verify(row).editABunchMoreStuff();
verify(row).saveToDatabase();
verifyNoMoreInteractions(row);
于 2009-02-05T03:43:07.383 に答える
12

トピックについて100%ではありませんが、検証の反対を探していました。これが唯一の関連する結果でした。結局、Mockito.verifyZeroInteractions(mock);の後になりました。

他の誰かがこれを探してここにたどり着いた場合に備えて...

于 2011-01-27T14:20:00.370 に答える