ホームページ  >  記事  >  Java  >  Mockito を使用してスーパークラス内の特定のメソッド呼び出しをモックするにはどうすればよいですか?

Mockito を使用してスーパークラス内の特定のメソッド呼び出しをモックするにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-10-30 18:36:30159ブラウズ

How to Mock Specific Method Calls in Superclasses with Mockito?

Mockito を使用したスーパークラス内の特定のメソッド呼び出しのモック

テスト シナリオでは、スーパークラス内の特定のメソッド呼び出しのみをモックする必要がある場合があります。他人の本来の行動を維持すること。これは、Mockito の柔軟なモック機能を使用して実現できます。

次のクラス階層を考えてみましょう:

<code class="java">class BaseService {

    public void save() {...}
}

class ChildService extends BaseService {

    public void save() {
        // Custom logic
        super.save();
    }
}</code>

この例では、ChildService の super.save() への呼び出しのみをモックしたいと考えています。 BaseService の save() の元の実装を実行できるようにします。

これを実現するには、スパイ関数を使用して ChildService のプロキシを作成できます。

<code class="java">ChildService classToTest = Mockito.spy(new ChildService());</code>

次に、 ChildService のコンテキスト内で super.save() の動作をスタブする必要があります。ただし、super は ChildService 内の BaseService クラスを参照するため、Mockito.doNothing() を使用する前に classToTest を BaseService にキャストする必要があります。

<code class="java">Mockito.doNothing().when((BaseService)classToTest).validate();</code>

BaseService の validate() メソッドをスタブすることで、事実上、テスト中に呼び出されないようにするためです。その結果、ChildService の super.save() 呼び出しのみがモックによってインターセプトされます。

テストを完了するには、classToTest で save() を呼び出し、ChildService で予期されるロジックが実行されることをアサートします。

<code class="java">classToTest.save();
verify(classToTest).load();</code>

このアプローチにより、継承されたメソッドの機能を維持しながら、スーパークラス内の特定のメソッド呼び出しを選択的にモックすることができます。これは、クラス階層の変更やコードのリファクタリングが不可能な状況で有用であることがわかります。

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

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