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

标签 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

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

最佳答案

经过一些实验,我发现用 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/

相关文章:

python - 如何断言 python unittest 没有引发错误

google-app-engine - 测试命名空间

junit - 为什么Junit仍然允许类扩展TestCase在其中使用注释@Test?

java - JUnit 5 中的 ExternalResource 和 TemporaryFolder 等价物是什么?

java - “发布到本地主机上的 tomcat v7.0 服务器...”遇到错误

java - Android:启动新 Activity 时关闭 Activity ?

c++ - 使用 GTest 和 GMock : shared vs. 静态库进行测试

php - "Web interface"到 PHPUnit 测试?

java - 如果我在 Spring Boot 中只返回 Java 实例数组,则 http 响应正文中有一个空数组

java - spring mvc 建立多对一关系