将JUnit Theory中的Datapoints绑定到特定变量

时间:2014-12-09 07:35:15

标签: java junit

我有以下理论进行测试。在代码中,我希望变量a为偶数,变量b为奇数

@RunWith(Theories.class)
public class TestJunit{
   // add the error
  @DataPoints
  public static Integer[] integersOdd() {
     return new Integer[]{1, 3, 5};
  }

  @DataPoints
  public static Integer[] integersEven() {
    return new Integer[]{2, 4, 6};
 }

   @Theory
   public void testAdd(Integer a , Integer b) {
        ...
   }
}

现在我正在使用assumeTrue和验证函数,如:

   public boolean validateInput(Integer a, Integer b){
     Set<Integer> even = new HashSet<Integer>(Arrays.asList(integersEven()));
     Set<Integer> odd = new HashSet<Integer>(Arrays.asList(integersOdd()));
     return (even.contains(a) && odd.contains(b));
   }

修改理论:

   @Theory
   public void testAdd(Integer a , Integer b) {
     Assume.assumeTrue(validateInput(a,b));
     System.out.println("a="+a+", b="+b);
     assertTrue(a+b>-1);
   // add any test
   }

这是一种非常肮脏的方式,因为Java将选择所有组合,并将丢弃 assumeTrue 处的输入。如果我有10个数据点的10个理论怎么办? Java将尝试100种组合,我只想要10个!

有没有巧妙的方法呢?可能是一些注释告诉JUnit从DataPoint中选择变量的值?

修改 我发现的另一种方法是使用测试生成器。我正在使用JUnit-QuickCheck [Read Here]根据变量所需的范围生成随机数据。然后我将它们封装在一个类中,并将此对象传递给我的理论进行测试。

1 个答案:

答案 0 :(得分:1)

JUnit 4.12允许理论中的命名数据点。这里是original pull request,这里是release notes for 4.12 - 寻找&#34;添加了匹配特定数据点的机制&#34;。