以前,在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中,参数化测试适用于使用不同参数实例化的类的实例?
答案 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团队正在处理的请求,请参见