这个测试类:
@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
这非常违反直觉,因为我希望数据生成函数只被调用一次。这对创建随机数据或数据生成方法在每次调用时返回不同结果的任何情况都有影响,所以我想了解它。
最佳答案
经过一些实验,我发现用 c
args 测试一个长度为 n
的数组,生成函数被调用 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};
}
关于java - 为什么我的 DataPoints 方法被多次调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23240300/