JUnit @Rule将参数传递给test

时间:2010-06-17 10:01:20

标签: java parameters junit junit-rule

我想创建@Rule以便能够执行此类操作

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

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

但是我确实得到了

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

有没有办法绕过它并在@Rule

中设置i参数

5 个答案:

答案 0 :(得分:8)

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

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

  

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

我希望这会有所帮助。

答案 1 :(得分:8)

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

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

 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 :(得分:1)

最近我开始了zohhak项目。它允许你用参数编写测试(但它是一个跑步者,而不是规则):

@TestWith({
   "25 USD, 7",
   "38 GBP, 2",
   "null,   0"
})
public void testMethod(Money money, int anotherParameter) {
   ...
}

答案 3 :(得分:0)

应该注意的是,不能将参数直接传递给测试方法。现在可以使用Theories@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

随着考试的通过。

答案 4 :(得分:-3)

无法完成,即使使用@Rule,也无法将参数传递给测试方法。