スーパークラスの実装を保持しながらサブクラス メソッドをモックする
広く使用されている Java モッキング フレームワークである Mockito は、特定のメソッドを選択的にモックするという課題に直面することがよくあります。クラス階層内で。この記事では、スーパークラスから継承されたメソッドの呼び出しのみをモックしたいシナリオについて説明します。
問題ステートメント
次のクラス構造を考えてみましょう。
<code class="java">class BaseService { public void save() {...} } public Childservice extends BaseService { public void save(){ //some code super.save(); } } </code>
単体テストでは、ChildService の実装に影響を与えずに、super.save() の 2 番目の呼び出しのみをモックすることができます。
解決策
テスト目的で既存のクラス階層をリファクタリングすることは通常推奨されませんが、コードベースを変更せずにこの課題に対処する方法はあります。
次のアプローチを検討してください。
<code class="java">class BaseService { public void validate(){ fail(" I must not be called"); } public void save(){ //Save method of super will still be called. validate(); } } class ChildService extends BaseService{ public void load(){} public void save(){ super.save(); load(); } } @Test public void testSave() { ChildService classToTest = Mockito.spy(new ChildService()); // Prevent/stub logic in super.save() Mockito.doNothing().when((BaseService)classToTest).validate(); // When classToTest.save(); // Then verify(classToTest).load(); }</code>
このソリューションは、 Mockito の Mockito.spy() API は、ChildService クラスのインスタンスをラップします。次に、Mockito.doNothing() を使用して BaseService (スーパークラス) の validate() メソッドをオーバーライドします。これにより、テスト中に validate() のロジックが確実に回避されます。その結果、ChildService.save() の実際の実装が呼び出されますが、super.save() への呼び出しは事実上スタブ化されます。
追加メモ
これ外部メソッドのスタブ化やモック化はテストを脆弱にし、テスト結果の精度に影響を与える可能性があるため、この手法は慎重に使用する必要があります。ただし、クラス階層のリファクタリングが選択肢にない場合には、これは実用的な解決策となる可能性があります。
以上がMockito でスーパークラスの実装を維持しながらサブクラス メソッドをモックするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。