3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Gakken LEAPAdvent Calendar 2024

Day 7

JUnitの@MethodSourceを活用して複雑な条件付きロジックをテストする

Last updated at Posted at 2024-12-06

はじめに

こんにちは、Gakken LEAP のエンジニアの Minami です。
WEBアプリケーションをJavaで開発するにあたり、テストツールとしてJUnitを使用しました。
単純な機能だけでなく、特定の条件に基づいて動作するロジックのテストは、実装や管理が面倒ではありますが、とても重要なことです。この記事では、@￰MethodSource を活用して、複数のテストパターンを簡単にまとめる方法を解説します。


サンプル用テスト対象機能の概要

今回のテスト対象は、数値リストから偶数のみを抽出し、その合計を計算するメソッドです。このメソッドの特徴は以下の通りです:

  1. 入力:整数のリスト
  2. 処理:偶数をフィルタリング
  3. 出力:偶数の合計

サンプルコードの解説

まず、テスト対象となる 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を含む負の偶数をテスト
    );
}

このデータセットでは、以下のようなケースをカバーしています。

  1. 偶数と奇数が混在するリスト
  2. 偶数のみのリスト
  3. 偶数が含まれないリスト
  4. 空リスト
  5. 負の数やゼロを含むリスト

テストパターンさえ整理できていれば、あとはこのデータセットにまとめて書いておくだけなので、管理も楽になります。

テスト結果

テストを実行すると、各ケースについて期待通りの結果が得られることを確認できます。

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 では教育をアップデートしていきたいエンジニアを絶賛大募集しています!!

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?