2016-10-05 81 views
9

こんにちは私はJUnitテストケースを書くときに問題に遭遇し、比較的新しいMockitoです。void関数のMockito - thenCallRealMethod()void

私は嘲笑しているクラスの関数を持っていますが、この関数はvoid戻り値型であることがあります。私の模擬クラスからこの関数を呼び出すと、元の関数を呼び出さないということを私が理解している(そしてデバッグ経験がある)。これを克服するために、 "when"を "thenCallRealMethod()"で使用しようとしました。

when(instance.voidFunction()).thenCallRealMethod(); 

"voidFunction"は、私が起動したくないロジックでいっぱいです。私はこれを避けるために文を抽出しました。私はdoReturn().when().voidFunction()の形式を使用するべきであることを読んだが、これを行うと実際の方法が呼び出されない。

「when」ステートメントの前に呼び出されたvoidFunction()が欲しくないため、ここでスパイを使用することはできませんでした。何か助けていただければ幸いです。これは非常に簡単な解決策であると私は謝ります。ありがとう!

+0

[私の答えは[この質問](http://stackoverflow.com/q/11462697)は、私が思う理由を説明しています。あなたがMockitoを学んでいるだけなら、今はそれを読む時間です。 –

+0

本当に助けてくれてありがとうございました。私はテストファイルを既存のコードベースで既存のコードベースに基づいて学習していましたが、どちらの方法も見たことがありますが、ときには2度の短所にぶつかって助言に同意します – CRDamico

+1

将来の読者には構文が混乱することがあります。慎重に考えてください。 –

答えて

14

whenの構文は無効な方法では機能しません(whenに収まらない)、戻り値がない場合はdoReturnは適用されません。 doCallRealMethodはあなたが望む答えでしょう。

doCallRealMethod().when(instance).voidFunction(); 

ベアモック上の実際のメソッドを呼び出すとき、あなたは理由フィールドを設定するものも含め、すべてのコンストラクタとイニシャライザの呼び出しをスキップしますスパイ嘲笑のオブジェクトとは異なり、非常に現実的な動作を得られない場合があることに注意しました。つまり、あなたのメソッドがインスタンス状態をまったく使用している場合は、doCallRealMethodまたはthenCallRealMethodのモックとしては動作しない可能性があります。スパイを使用すると、クラスの実際のインスタンスを作成できます。その後、Mockito.spyメソッドは、そのインスタンスの状態をコピーして、より現実的なやり取りを行います。

+0

ありがとう、それは私が必要とするものです、私は具体的にその方法を探して、それを見つけることができませんでした。それは働いているように見えます! – CRDamico

関連する問題