JUnit @Rule将参数传递给test

IAd*_*ter 12 java parameters junit junit-rule

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

@Test public void testValidationDefault(int i) throws Throwable {..}
Run Code Online (Sandbox Code Playgroud)

其中i是参数传递给测试的@Rule.

不过我确实得到了

java.lang.Exception: Method testValidationDefault should have no parameters
Run Code Online (Sandbox Code Playgroud)

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

Jen*_*der 9

正如IAdapter所说,你无法使用规则传递参数,但你可以做类似的事情.

实现一个包含所有参数值的规则,并为每个参数值评估测试一次,并通过方法提供值,因此测试可以从规则中提取它们.

考虑像这样的规则(伪代码):

public class ParameterRule extends 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()
                 }      
             }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

你应该可以在这样的测试中使用它:

 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
     }
 }
Run Code Online (Sandbox Code Playgroud)

  • 我实际上构建了一个可行的例子:https://github.com/schauder/parameterizedTestsWithRules (2认同)

Mar*_*coS 8

我使用@Parameters@RunWith(value = Parameterized.class)传递值到测试.这里可以找到一个例子.

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

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

我希望这有帮助.


IAd*_*ter -4

这是不可能的,即使使用@Rule,你也无法将参数传递给测试方法。