JUnit @Rule将参数传递给测试

2022-09-04 20:46:09

我想创建@Rule,以便能够做这样的事情

@Test public void testValidationDefault(int i) throws Throwable {..}

其中 i 是参数,由 @Rule 传递给测试。

但是我确实得到了

java.lang.Exception: Method testValidationDefault should have no parameters

有没有办法绕过它并在@Rule中设置i参数?


答案 1

正如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
     }
 }

答案 2

我使用 和 将值传递给测试。可以在此处找到一个示例。@Parameters@RunWith(value = Parameterized.class)

我不知道注释,但在阅读这篇文章后,我认为它比将参数传递给测试还有另一个目的:@Rule

如果在测试类中,您创建了一个指向实现 MethodRule 接口的对象的字段,并通过添加@Rule实现将其标记为规则进行处理,则 JUnit 将为每个将运行的测试回调您的实例,从而允许您在测试执行周围添加其他行为。

我希望这有帮助。