JUnit5のパラメーター化された新機能を使用して、メソッドレベルで実行する代わりに、テストクラスを実行してテストパラメーターを受け取ることは可能ですか?
JUnit 4では、@RunWith(Parameterized::class)
plus継承などのランナーを使用して、パラメーターの配列をサブクラスに渡すことができますが、新しいJUnit 5apiを使用して同等の何かを実現できるかどうかはわかりません。
JUnit 5には、パラメーター化されたテストを行うための独自のアプローチがあり、もちろん、JUnit 4とは異なります。新しいアプローチでは、クラスレベルで、つまりすべてのテストメソッドを介してパラメータ化されたフィクスチャを使用することはできません。したがって、パラメータ化されたすべてのテストメソッドには、パラメータへのリンクを明示的に注釈として付ける必要があります。
JUnit 5は、 ドキュメント および ガイド にある多くのパラメータソースタイプを提供します。
あなたの場合、Junit 4の@Parameters
から移行する最も簡単な方法は、@MethodSource
の@ArgumentsSource
またはorg.junit.jupiter.params.provider.*
を使用することです。
JUnit 4:
@RunWith(Parameterized.class)
public class MyTestWithJunit4 {
@Parameters
public static Collection<Object[]> data() {
return Arrays.asList(new Object[][] {
{ 0, 0, 0 },
{ 1, 2, 3 },
{ 5, 3, 8 }
});
}
int first;
int second;
int sum;
public MyTestWithJunit4(int first, int second, int sum) {
this.first = first;
this.second = second;
this.sum = sum;
}
@Test
public void test() {
assertEquals(sum, first + second));
}
}
JUnit 5(with @MethodSource
):
class MyTestWithJunit5
{
@DisplayName( "Test with @MethodSource" )
@ParameterizedTest( name = "{index}: ({0} + {1}) => {2})" )
@MethodSource( "localParameters" )
void test( int first, int second, int sum )
{
assertEquals( sum, first + second );
}
static Stream< Arguments > localParameters()
{
return Stream.of(
Arguments.of( 0, 0, 0 ),
Arguments.of( 1, 2, 3 ),
Arguments.of( 5, 3, 8 )
);
}
}
JUnit 5(with @ArgumentsSource
):
class MyTestWithJunit5
{
@DisplayName( "Test with @ArgumentsSource" )
@ParameterizedTest( name = "{index}: ({0} + {1}) => {2})" )
@ArgumentsSource( Params.class )
void test( int first, int second, int sum )
{
assertEquals( sum, first + second );
}
static class Params implements ArgumentsProvider
{
@Override
public Stream< ? extends Arguments > provideArguments( ExtensionContext context )
{
return Stream.of(
Arguments.of( 0, 0, 0 ),
Arguments.of( 1, 2, 3 ),
Arguments.of( 5, 3, 8 )
);
}
}
}
@MethodSource
のメソッドと@ArgumentsSource
のクラスは、同じクラス内だけでなく、それらを使用するテストメソッドを含むどこにでも配置できると考えてください。また、@MethodSource
はvalue
がString[]
であるため、複数のソースメソッドを提供できます。
いくつかの意見と比較
JUnit 4では、パラメーターを提供するファクトリメソッドは1つしかなく、テストはそれらのパラメーターを中心に構築されることになっています。それどころか、JUnit 5は、パラメーターのバインドにおいてより抽象化と柔軟性を提供し、テストロジックをセカンダリであるパラメーターから切り離します。これにより、パラメーターソースから独立してテストを構築し、必要に応じて簡単に変更できます。
依存関係の要件
パラメータ化されたテスト機能はコアjunit-jupiter-engine
には含まれていませんが、別の依存関係にあります junit-jupiter-params
。