見出し画像

【JUnitとMockitoを使ったテストコードをスラスラ書くための超簡単な考え方】

本noteでは、なかなかテストコードが書けないという方向けに書きたいと思います。

こちらを意識するだけで、テストコードはかなり書けるようになると思います。ぜひ読んで見てください。


1、テスト対象のコードを理解する

テストしようとしているメソッドが、どのような入力を受け、どのような出力を返すのかを明確にします。

依存している外部クラスやサービスがある場合、それらがどのように機能しているかも理解します。

2、ユニットテストの目的を把握する

ユニットテストは、単一のメソッドの動作を検証することが目的です。外部依存(他のクラスや、データベース、ネットワーク)を切り離し、そのメソッドが正しいかどうかをチェックします。

3、Mockitoで依存をモックする

モックする必要がある依存クラスを特定します。依存するクラスや外部システムをそのまま使うのではなく、Mockito .mock()でダミーのオブジェクトを作成して挙動を制御します。

when(mockedObject.someMethod()).thenReturn(someValue);

で依存クラスのメソッドが返す値を設定します。

4、JUnitで検証する

テスト対象メソッドを実行し、期待する結果が返るかどうかをassert分で確認します。例えば、assertEquals(expectedValue, actualValue);のように実際の結果が期待通りかチェックします。
エッジケースや以上系もテストすることが重要です。



下記は、JUnitとMockitoを使って、どんなコントローラーやサービスの処理でもテストできるテンプレートを作成しました。このテンプレートに従って、テストするクラスやメソッドに合わせて適宜カスタマイズすれば、あらゆる処理に対応可能です。

// 必要なインポート
import static org.mockito.Mockito.*;
import static org.junit.jupiter.api.Assertions.*;

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;

// テスト対象クラス
public class MyTestTemplate {

    // 依存しているサービスやクラスをモック
    @Mock
    private DependentService dependentService;

    // テスト対象のクラスにモックを注入
    @InjectMocks
    private TargetService targetService;

    // テスト前のセットアップ
    @BeforeEach
    public void setup() {
        // Mockitoの初期化
        MockitoAnnotations.openMocks(this);
    }

    // 正常系のテスト
    @Test
    public void testSuccessScenario() {
        // モックの設定
        when(dependentService.someMethod(any())).thenReturn(mockedResponse());

        // テスト対象メソッドの実行
        Object result = targetService.methodUnderTest(input);

        // 結果の検証
        assertEquals(expectedResult, result);
        
        // モックが適切に呼ばれたか検証
        verify(dependentService, times(1)).someMethod(any());
    }

    // 異常系(例外処理)のテスト
    @Test
    public void testExceptionScenario() {
        // 例外をスローするモックの設定
        when(dependentService.someMethod(any())).thenThrow(new RuntimeException("Test Exception"));

        // 例外がスローされることを確認
        assertThrows(RuntimeException.class, () -> {
            targetService.methodUnderTest(input);
        });

        // モックが適切に呼ばれたか検証
        verify(dependentService, times(1)).someMethod(any());
    }

    // ヘルパーメソッド: モックレスポンスを生成
    private Object mockedResponse() {
        // 必要に応じて返すモックデータをここで生成
        return new Object();  // 例: モックデータのインスタンスを返す
    }
}

ぜひこちらを使ってテストコードを書けるようにしてみてください!!

以上です。

いいなと思ったら応援しよう!