我想创造@Rule
能够做这样的事情
@Test public void testValidationDefault(int i) throws Throwable {..}
其中 i 是传递给测试的参数@Rule
。
但是我确实得到
java.lang.Exception: Method testValidationDefault should have no parameters
有什么方法可以绕过它并在中设置 i 参数@Rule
?
正如 IAdapter 所说,您不能使用规则传递参数,但您可以执行类似的操作。
实现一个保存所有参数值的规则,并为每个参数值评估一次测试并通过方法提供值,因此测试可以从规则中提取它们。
考虑这样的规则(伪代码):
public class ParameterRule implements MethodRule{
private int parameterIndex = 0;
private List<String> parameters;
public ParameterRule(List<String> someParameters){
parameters = someParameters;
}
public String getParameter(){
return parameters.get(parameterIndex);
}
public Statement apply(Statement st, ...){
return new Statement{
public void evaluate(){
for (int i = 0; i < parameters.size(); i++){
int parameterIndex = i;
st.evaluate()
}
}
}
}
}
您应该能够在这样的测试中使用它:
public classs SomeTest{
@Rule ParameterRule rule = new ParameterRule(ArrayList<String>("a","b","c"));
public void someTest(){
String s = rule.getParameter()
// do some test based on s
}
}
最近我开始了zohhak项目。它允许您编写带有参数的测试(但它是运行程序,而不是规则):
@TestWith({
"25 USD, 7",
"38 GBP, 2",
"null, 0"
})
public void testMethod(Money money, int anotherParameter) {
...
}
应该注意的是,不能直接将参数传递给测试方法已不再正确。现在可以使用Theories
and @DataPoints
/来完成@DataPoint
。
例如:
@RunWith(Theories.class)
public class TestDataPoints {
@DataPoints
public static int [] data() {
return new int [] {2, 3, 5, 7};
}
public int add(int a, int b) {
return a + b;
}
@Theory
public void testTheory(int a, int b) {
System.out.println(String.format("a=%d, b=%d", a, b));
assertEquals(a+b, add(a, b));
}
}
输出:
a=2, b=2 a=2, b=3 a=2, b=5 a=2, b=7 a=3, b=2 a=3, b=3 a=3, b=5 a=3, b=7 a=5, b=2 a=5, b=3 a=5, b=5 a=5, b=7 a=7, b=2 a=7, b=3 a=7, b=5 a=7, b=7
随着测试通过。
它无法完成,即使使用@Rule,您也无法将参数传递给测试方法。