为什么此JUnitTest失败?

时间:2018-10-14 13:50:40

标签: java unit-testing assert

    @Test
public void testAscendingNumbers() {
    Object[][] testData = new Object[][]{
        {new int[]{1, 2, 3, 4, 5}, 4, 30},
        {new int[]{1, 2, 2, 2, 2}, 4, 0},
        {new int[]{1, 1, 1, 4, 3}, 5, 0},
        {new int[]{1, 2, 4, 3, 1}, 4, 30},
        {new int[]{2, 3, 4, 6, 1}, 5, 0},
        {new int[]{1, 2, 6, 4, 5}, 4, 0},
        {new int[]{5, 4, 3, 2, 1}, 4, 30},
        {new int[]{6, 5, 3, 4, 2}, 5, 40},
        {new int[]{2, 2, 3, 4, 4}, 4, 30},
        {new int[]{2, 6, 3, 5, 3}, 4, 40}
    };

    KniffelTableModel instance = new KniffelTableModel();
    for (Object[] obj : testData) {
        System.out.println((int) obj[1]);
        System.out.println("ascendingNumbers - " + obj[1] + " in " + Arrays.toString((int[]) obj[0]));
        System.out.println("Expect: " + obj[2] + " --> got: " + instance.ascendingNumbers((int[]) obj[0], (int) obj[1]));
        assertEquals((int) obj[2], instance.ascendingNumbers((int[]) obj[0], (int) obj[1]));
    }
}

出于测试目的,我在这里没有使用过甲基化测试,但它仍然可以正常工作...问题是,我期望的结果与我正在测试的函数的结果相同,但它仍会说不一样... 我知道它必须是正确的,因为在“期望”行中,我得到2个相等的值... enter image description here

1 个答案:

答案 0 :(得分:0)

可能地, KniffelTableModel实例是有状态的,而KniffelTableModel.ascendingNumbers()对于后续使用相同参数的调用不会产生相同的结果。

否则它可能会修改输入数组。

您可以重写测试,以便每个用例仅调用一次KniffelTableModel.ascendingNumbers(),即:

KniffelTableModel instance = new KniffelTableModel();
for (Object[] obj : testData) {
    System.out.println((int) obj[1]);
    System.out.println("ascendingNumbers - " + obj[1] + " in " + Arrays.toString((int[]) obj[0]));

    final int result = instance.ascendingNumbers((int[]) obj[0], (int) obj[1]);

    System.out.println("Expect: " + obj[2] + " --> got: " + result);
    assertEquals((int) obj[2], result);
}

请检查KniffelTableModel类中的状态变量,例如:

  • 非最终字段,
  • 非最终静态字段,
  • 可变类类型的字段
  • 其他类的非最终静态用法。

如果需要其他帮助,请发布KniffelTableModel类的代码。