ホームページ >Java >&#&チュートリアル >子クラスでスーパークラスのメソッド呼び出しを模擬するにはどうすればよいですか?

子クラスでスーパークラスのメソッド呼び出しを模擬するにはどうすればよいですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-04 05:51:01318ブラウズ

How to Mock Superclass Method Invocation in a Child Class?

子クラスでのスーパークラス メソッド呼び出しのモック

単体テストでは、サブクラス内のメソッド呼び出しをモックする必要がある場合がありますが、スーパークラスでは元の動作がそのまま残ります。このシナリオは、親クラスに委任するメソッドをテストするときに発生する可能性があります。

次の例を考えてみましょう:

<code class="java">class BaseService {
    public void save() {...}
}

public Childservice extends BaseService {
    public void save(){
        //some code
        super.save();
    }
}</code>

この場合、テストでは super.save() の呼び出しのみをモックする必要があります。

これを実現する 1 つのアプローチは、Mockito が提供するスパイ機能を使用することです。 ChildService インスタンスをスパイすることで、BaseService インスタンスにアクセスでき、メソッド呼び出しをきめ細かく制御できるようになります。

<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>

BaseService クラスの validate() メソッドをモックすることで、テストは次のことを保証します。 super.save() の元のロジックは実行されません。さらに、ChildService クラスのload() メソッドをスタブすると、それが期待どおりに呼び出されることを確認できます。このアプローチにより、メソッド呼び出しをきめ細かく制御でき、テスト中に特定の機能を分離できます。

以上が子クラスでスーパークラスのメソッド呼び出しを模擬するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。