【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(); // 例: モックデータのインスタンスを返す
}
}
ぜひこちらを使ってテストコードを書けるようにしてみてください!!
以上です。