はじめに
こんにちは、Gakken LEAP のエンジニアの Minami です。
WEBアプリケーションをJavaで開発するにあたり、テストツールとしてJUnitを使用しました。
単純な機能だけでなく、特定の条件に基づいて動作するロジックのテストは、実装や管理が面倒ではありますが、とても重要なことです。この記事では、@MethodSource を活用して、複数のテストパターンを簡単にまとめる方法を解説します。
サンプル用テスト対象機能の概要
今回のテスト対象は、数値リストから偶数のみを抽出し、その合計を計算するメソッドです。このメソッドの特徴は以下の通りです:
- 入力:整数のリスト
- 処理:偶数をフィルタリング
- 出力:偶数の合計
サンプルコードの解説
まず、テスト対象となる sumEvenNumbers メソッドは以下のように実装されています。
private int sumEvenNumbers(List<Integer> numbers) {
return numbers.stream()
.filter(n -> n % 2 == 0) // 偶数をフィルタリング
.mapToInt(Integer::intValue) // intに変換
.sum(); // 合計を計算
}
このメソッドでは、Stream API を活用して、リスト内の偶数をフィルタリングし、その合計を計算します。
テストコード
次に、@MethodSource を使ったテストメソッドを見てみましょう。
@ParameterizedTest
@MethodSource("provideTestDataForSumEvenNumbers")
void testSumEvenNumbers(List<Integer> input, int expectedSum) {
int result = sumEvenNumbers(input);
assertEquals(expectedSum, result, () ->
String.format("Expected sum of even numbers in %s to be %d, but got %d", input, expectedSum, result)
);
}
このテストメソッドでは、@MethodSource を使って、外部メソッド provideTestDataForSumEvenNumbers からテストデータを供給しています。テストデータは以下のように構築されています。
private static Stream<Arguments> provideTestDataForSumEvenNumbers() {
return Stream.of(
Arguments.of(List.of(1, 2, 3, 4, 5), 6), // 2 + 4 = 6
Arguments.of(List.of(2, 4, 6, 8, 10), 30), // 2 + 4 + 6 + 8 + 10 = 30
Arguments.of(List.of(1, 3, 5, 7, 9), 0), // 偶数がない
Arguments.of(List.of(), 0), // 空リスト
Arguments.of(List.of(0, 2, 4, -6), 0) // 0を含む負の偶数をテスト
);
}
このデータセットでは、以下のようなケースをカバーしています。
- 偶数と奇数が混在するリスト
- 偶数のみのリスト
- 偶数が含まれないリスト
- 空リスト
- 負の数やゼロを含むリスト
テストパターンさえ整理できていれば、あとはこのデータセットにまとめて書いておくだけなので、管理も楽になります。
テスト結果
テストを実行すると、各ケースについて期待通りの結果が得られることを確認できます。
Test run started
✔ testSumEvenNumbers([1, 2, 3, 4, 5], 6)
✔ testSumEvenNumbers([2, 4, 6, 8, 10], 30)
✔ testSumEvenNumbers([1, 3, 5, 7, 9], 0)
✔ testSumEvenNumbers([], 0)
✔ testSumEvenNumbers([0, 2, 4, -6], 0)
Test run completed
まとめ
この記事では、@MethodSource を使ったテストデータ管理の利便性を解説しました。特に、条件付きロジックのテストにおいて、この手法を活用することで、テストコードの柔軟性と可読性を向上させることができます。
エンジニア募集中
Gakken LEAP では教育をアップデートしていきたいエンジニアを絶賛大募集しています!!