ホームページ >Java >&#&チュートリアル >Mockito を使用して Java で最終クラスをモックするにはどうすればよいですか?

Mockito を使用して Java で最終クラスをモックするにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-12-09 21:38:11934ブラウズ

How Can I Mock Final Classes in Java Using Mockito?

Mockito を使用した最終クラスのモック

Java テストの領域では、依存関係を分離してテストするために非最終クラスをモックするのが一般的な方法です。制御された環境でコードを作成します。ただし、最終クラスは、モックに関して明確な課題を引き起こします。

たとえば、次の例を考えてみましょう。

public final class RainOnTrees {
   public void startRain() {}
}

public class Seasons {
   RainOnTrees rain = new RainOnTrees();
   public void findSeasonAndRain() {rain.startRain();}
}

このシナリオでは、RainOnTrees という名前の最終クラスがあり、それに依存するクラス Seasons。 Seasons を効果的にテストするには、RainOnTrees をモックする必要があります。ただし、Mockito バージョン 1 では、最終クラスのモックは本質的に不可能です。

Mockito Inline to the Rescue

この制限を克服するために、Mockito バージョン 2 では、mockito-inline が導入されました。コンストラクターを含む静的クラスと最終クラスのモックを可能にするパッケージ。この機能を利用するには、次の依存関係を Gradle ファイルに追加します。

testImplementation 'org.mockito:mockito-inline:2.13.0'

Mockito Inline によるモック

mockito-inline パッケージが追加されたら、final をモックします。クラスは簡単になります:

@ExtendWith(MockitoExtension.class)
public class SeasonsTest {
    @Mock
    RainOnTrees rainMock;

    @BeforeEach
    public void setUp() {
        MockitoAnnotations.initMocks(this);
    }

    @Test
    public void testFindSeasonAndRain() {
        Seasons seasons = new Seasons();
        // Inject the mock into the Seasons class
        ReflectionTestUtils.setField(seasons, "rain", rainMock);

        seasons.findSeasonAndRain();

        // Verify that the mocked method was called
        Mockito.verify(rainMock).startRain();
    }
}

Final注

最終クラスのモックは、最終クラスの実装が変更された場合に失敗する可能性のある脆弱なテストにつながる可能性があるため、慎重に使用する必要があることに注意することが重要です。可能であれば、依存関係注入用の非最終クラスを作成することは、テストの推奨アプローチです。

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

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