具有相同参数的JUnit 5多个参数化测试-迁移参数化

时间:2019-01-18 20:24:17

标签: java testing junit migration junit5

以前,在JUnit4中,您可以执行以下操作:

@RunWith(Parameterized.class)
public class MyTest
{
    private final int number;

    public MyTest(int number) {
        this.play = play;
    }

    @Test
    public void testIsEven() {
        assertEquals(true, number % 2 == 0);
    }

    @Test
    public void testIsNotOdd() {
        assertEquals(false, number % 2 != 0);
    }

    @Parameterized.Parameters
    public static int[] data() {
        return new int[] { 2, 4, 6 } 
    }
}

这将遍历数组,使用每个值实例化MyTest,然后在每个这些实例上运行所有测试。有关更多详细信息,请参见Parameterized docs

现在,在JUnit5中,情况已经发生了变化,根据new docs,您必须编写类似的测试:

public class MyTest {
    @ParameterizedTest
    @MethodSource("data")
    public void testIsEven(int number) {
        assertEquals(true, number % 2 == 0);
    }

    @ParameterizedTest
    @MethodSource("data")
    public void testIsNotOdd(int number) {
        assertEquals(false, number % 2 != 0);
    }

    public static int[] data() {
        return new int[] { 2, 4, 6 } 
    }
}

您必须为每个单独的测试重复参数和数据源。有没有一种方法可以像JUnit4中那样进行,在JUnit4中,参数化测试适用于使用不同参数实例化的类的实例?

3 个答案:

答案 0 :(得分:1)

到目前为止(JUnit 5.3.2或5.4.0-M1)似乎还没有。

我试图创建一个Extension来处理这种情况,但是测试类实例化发生在考虑TestTemplateInvocationContextProvider扩展名之前。

因此对于同一个测试类,似乎不可能有多个实例化上下文。

您肯定可以通过在JUnit5 github repository上发布问题来询问核心团队。

答案 1 :(得分:1)

AFAIR junit5支持元注释。您可以定义一个自定义批注,然后将其放在测试中:

@MethodSource("data")
@ParameterizedTest
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface OldParameterizedTest {
}

public class MyTest {
    @OldParameterizedTest
    public void testIsEven(int number) {
        assertEquals(true, number % 2 == 0);
    }

    public static int[] data() {
        return new int[] { 2, 4, 6 } 
    }
}

答案 2 :(得分:1)

(评论摘要)

当前不支持在测试类中为所有/多个方法重用相同的参数(版本5.3.2和5.4.0-M1)。但这已经是JUnit团队正在处理的请求,请参见