@RunWith(JUnitParamsRunner.class)
public class MySimpleTest {
private MyRec rec;
private Matrix matrix;
@Before
public void createRecognizerBeforeEveryExecution() {
rec = new MyRec();
matrix = MatrixUtils.createMatrixWithValues();
}
public static Iterable<Object[]> data() {
return Arrays.asList(
new Object[]{"expectedvalue1", "input1"},
new Object[]{"expectedvalue2", "input2"}
);
}
@Test
@Parameters(method = "data")
public void test1(String output, String input) {
rec.fun1(matrix);
assertEquals(output, rec.someFunction(input));
}
public static Iterable<Object[]> data2() {
return Arrays.asList(
new Object[]{"expectedothervalue1", "input1"},
new Object[]{"expectedothervalue2", "input2"}
);
}
@Test
@Parameters(method = "data2")
public void test2(String output, String input) {
rec.fun1(matrix);
rec.fun2(matrix);
assertEquals(output, rec.someFunction(input));
}
}
我正在尝试找出进行此测试的正确方法。我想使用参数化测试,因为它真的很方便。
正如您所看到的,在每个测试函数中我都会调用一些函数(fun1
和 fun2
)。但我只需要在每次测试时调用它一次(例如,在每次参数化测试执行之前)。
有什么方法可以告诉 JUnitParams 在执行所有参数化测试之前应该执行其他函数吗?
我无法使用@Before
注释,因为正如您在test1
中看到的那样,我没有使用fun2
。它认为它应该由单独的函数执行。
最佳答案
解决方案 1:
由于 fun[1|2] 不依赖于内部测试状态,因此尝试将它们的调用相应地放在 data 和 data2 方法中。
public static Iterable<Object[]> data() {
rec.fun1(matrix);
return Arrays.asList(
new Object[]{"expectedvalue1", "input1"},
new Object[]{"expectedvalue2", "input2"}
);
}
public static Iterable<Object[]> data2() {
rec.fun1(matrix);
rec.fun2(matrix);
return Arrays.asList(
new Object[]{"expectedvalue1", "input1"},
new Object[]{"expectedvalue2", "input2"}
);
}
解决方案 2:
拆分测试用例不是最佳实践。您的测试更难维护。流程要复杂得多。您的测试启动还存在相互依赖的风险。有时重复测试会更好。
PS: 如果您使用字符串作为测试方法参数,最好按照此文件第 25 行中的方式传递它们: https://github.com/Pragmatists/JUnitParams/blob/master/src/test/java/junitparams/usage/SamplesOfUsageTest.java而不是特殊的方法。@Test
@Parameters({"AAA,1", "BBB,2"})
public void paramsInAnnotation(String p1, Integer p2) { }
关于java - JUnitParams - 在测试之前执行单独的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35697293/