为什么我的DataPoints方法被多次调用?

时间:2014-04-23 09:32:38

标签: java unit-testing junit

此测试类:

@RunWith(Theories.class)
public class TheoriesConfusion
{

    @DataPoints
    public static int[] ints()
    {
        System.out.println("Generator called");
        return new int[]{1, 2, 3, 4, 5};
    }

    @Theory
    public void twoArgTest(int x, int y)
    {
        assertTrue(x < y || x >= y);
    }
}

打印以下输出:

Generator called
Generator called
Generator called
Generator called
Generator called
Generator called
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.137 sec

这是违反直觉的,因为我希望数据生成函数只被调用一次。这对于创建随机数据或任何数据生成方法在每次调用时返回不同结果的情况都有影响,因此我想了解它。

1 个答案:

答案 0 :(得分:0)

经过一些实验,我发现使用n args对一个长度为c的数组进行测试,生成函数被称为x次,其中x = n^c + n^(c-1) + ... + n^0

source有点难以理解,但我的假设是它的工作原理是这样的(伪代码):

for firstArg in generateArgs():
    for secondArg in generateArgs():
        for thirdArg in generateArgs():
            testTheory(firstArg, secondArg, thirdArg)

这是有道理的,基本上它只是没有缓存方法的结果,所以如果你想要只调用一次方法,你必须注释一个静态字段,如:

@DataPoints
public static int[] ints = ints();

public static int[] ints()
{
    System.out.println("Generator called");
    return new int[]{1, 2, 3, 4, 5};
}
相关问题