是否可以使用JUnit5的参数化新功能来运行测试类来接收测试参数而不是在方法级别进行测试?
使用JUnit 4,可以使用诸如@RunWith(Parameterized::class)
加上继承的运行符将参数数组传递给子类,但我不确定是否可以实现等效但使用新的JUnit 5 api。
答案 0 :(得分:1)
JUnit 5 有其自己的进行参数化测试的方法,当然,它与 JUnit 4 不同。新方法不允许在类级别使用参数化的灯具,即通过其每种测试方法。 因此,每个参数化的测试方法都应使用指向参数的链接进行显式注释。
JUnit 5 提供了很多参数源类型,可以在documentation和guides
中找到对于您来说,从 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(带有@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(带有@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 中,我们只能使用一个提供参数的工厂方法,并且应该以这些参数为基础进行测试。 相反, JUnit 5 在绑定参数时提供了更多的抽象性和灵活性,并使测试逻辑与其次要参数脱钩。 这样可以独立于参数源构建测试,并在需要时轻松更改它们。
依赖性要求
参数测试功能未包含在核心junit-jupiter-engine
中,
但位于单独的依赖项junit-jupiter-params
中。