Mockito でスーパークラスの実装を維持しながらサブクラス メソッドをモックするにはどうすればよいですか?

Patricia Arquette
リリース: 2024-11-02 14:08:30
オリジナル
836 人が閲覧しました

How to Mock Subclass Methods While Preserving Superclass Implementations in Mockito?

スーパークラスの実装を保持しながらサブクラス メソッドをモックする

広く使用されている 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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート