我想在 JUnit 中创建一个数据驱动的参数化方法。
我看到的示例对整个类进行了参数化。
例如
@RunWith(Parameterized.class)
public class PrimeNumberCheckerTest {
但是,我想参数化单个测试方法,而不是整个类。
在 TestNG 中,类似的东西看起来像这样:
@DataProvider(name = "test1")
public static Object[][] primeNumbers() {
return new Object[][] {{2, true}, {6, false}, {19, true}, {22, false}, {23, true}};
}
// This test will run 4 times since we have 5 parameters defined
@Test(dataProvider = "test1")
public void testPrimeNumberChecker(Integer inputNumber, Boolean expectedResult) {
System.out.println(inputNumber + " " + expectedResult);
Assert.assertEquals(expectedResult,
primeNumberChecker.validate(inputNumber));
}
这种事情在 JUnit 中可能吗?
编辑:
最优雅/DRY 的方式是使用单个方法级注释 - 这正是我所希望的。
我找到了一个图书馆:
https://github.com/Pragmatists/junitparams
例子:
@RunWith(JUnitParamsRunner.class)
public class PersonTest {
@Test
@Parameters({"17, false",
"22, true" })
public void personIsAdult(int age, boolean valid) throws Exception {
assertThat(new Person(age).isAdult(), is(valid));
}
}
问题仍然存在 - JUnit 中是否内置了类似的东西?
如果不是,那么需要最少样板代码或类级扭曲的最接近内置的东西是什么?
最佳答案
您可以使用 @RunWith(Suite.class)
和 @Suite.SuiteClasses
将您的外部类变成一个套件,然后在内部嵌套类(定义套件的“子测试类”),每个都有自己的运行者。
@RunWith(Suite.class)
@Suite.SuiteClasses({MyFooTest.Individual.class, MyFooTest.WithParams.class})
public class MyFooTest {
@RunWith(Parameterized.class)
public static class WithParams {
@Parameterized.Parameters
public static Collection<Object[]> primeNumbers() {
...
}
@Test
public void testPrimeNumberChecker() {
...
}
...
}
public static class Individual {
@Test
public void someOneOffTest() {
...
}
...
}
}
关于java - JUnit 中的参数化测试方法,而不仅仅是整个类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41537855/