2016-05-05 71 views
0

私はメソッドの機能を置き換えるだけで、呼び出されたときにカウンタをインクリメントすることによってオブジェクトを持っています。メソッドはvoidの戻り値の型を持っていますので、私はmockitoを使ってvoidメソッドをスタブする方法を探していましたが、うまくいく解決策が見つかりませんでした。スタブvoidメソッドを使用してmockito

だから私は、私はこれを実行すると

int count = 0; 
Mockito.doReturn(++count).when(mockObject).mockObjectMethod(Mockito.anyString()); 

、私が手

org.mockito.exceptions.misusing.CannotStubVoidMethodWithReturnValue:私が読んだものから、私はこのような何かを考えていました私は2つの解決策を見つけたと考えています:doThrowを使用して、例外をキャッチしてカウンタをインクリメントするか、toAnswerを使用してカウンタをインクリメントしてAnswerを実装します。他にも解決策はありますか?

+1

http://stackoverflow.com/questions/2276271/how-to-make-mock-to-void- methods-with-mockito –

答えて

1

doThrowこれを処理するには本当に非凡な方法です。特に例外的なコードパスであり、残りのテスト対象メソッドがスローされた例外の後に動作しないようにするため、 。

doAnswerは、カウントを含むvoidメソッドの結果として任意の動作が発生するようにはるかに適切な方法です。

しかし、カウンタの目的がメソッドが正確な回数だけ呼び出されていることを単に保証するのであれば、スタブを全く必要としません。 voidメソッドのMockitoのデフォルトは、呼び出しを記録すること以外は何もしないことです。この場合は問題ありません。

doReturn(() -> ++count).when(mockObject).mockObjectMethod(Mockito.anyString()); 
//  ^---lambda--^ 

:このような(架空の)構文で

doReturn(++count).when(mockObject).mockObjectMethod(Mockito.anyString()); 

:これを混同しないよう十分に注意してください、注意点として

verify(mockObject, times(EXPECTED_COUNT)).mockObjectMethod(anyString()); 

:代わりに、検証を使用しますMockitoマッチャー以外のもの(実際には直観的ではないハックによるもの)を除いて、MockitoはJava構文で特別な扱いを受けません。あなたが持っているものを実行count = 0場合と、これは正確であり、唯一のMockitoが見るもの:

doReturn(1).when(mockObject).mockObjectMethod(Mockito.anyString()); 
+0

'verify'を使うのは意味がありますが、私はmockオブジェクトのメソッド本体を実行させたくありません。私はその呼び出し回数を数えたいだけですが、何もしません。 'verify'と' doNothing'を組み合わせることはできますか? – user1491636

+0

@ user1491636絶対に。 'doNothing'で既存の振る舞いを消去し、後でメソッド呼出し数を' verify'します。初めてそれをキャッチしないで申し訳ありません! –

関連する問題