1
/
5

[JUnit5]NestedクラスでMethodSourceのParameterizedTestを行う

JUnit5でexperimentalな機能ではあるものの、値を色々変えてテストしたいときに重宝するParameterizedTest。
データの渡し方としてValueSourceのようなシンプルなものもありますが、個人的にはMethodSourceをわりとよく使います。
で、設定ファイルから値をとってくる処理のテストのためにTestPropertySourceで値をいくつかのパターン設定するためにNestedクラスに分けたテストクラスを作ったのですが、
その中でMethodSourceなParameterizedTestをするやり方でちょっとハマったのでメモ。

MethodSource用のメソッドはstaticである必要があるので、テストクラスの中で定義したらNestedクラスの中ではそのメソッドが利用できず、かといってNestedクラスの中ではstaticメソッドが定義できない…
ということで詳しいお方に相談してみたら、Nestedクラスに@TestInstance(PER_CLASS)を付与するとそのクラス内でstaticでないMethodSource用のメソッドを作成して利用できるということを教えてもらいました。

サンプル:

class NestedParameterizedTest {

    @TestInstance(PER_CLASS)
    @Nested
    class Nestedクラス {

        @ParameterizedTest
        @MethodSource("testProvider")
        void sumテスト(int a, int b, int c) {
            assertEquals(c, a + b);
        }

        Stream<Arguments> testProvider() {
            return Arrays.stream(new Arguments[]{
                    Arguments.of(1, 2, 3)
            });
        }
    }
}

おかげさまで無事表題の目的は果たせたわけですが、
その後MethodSourceのドキュメントを改めて見てみると確かに

Factory methods within the test class must be static unless the PER_CLASS test instance lifecycle mode is used

と書いてありました…やっぱりちゃんとドキュメントは読まないとですね。

1 いいね!
1 いいね!