我可以模拟递归函数中使用的外部函数吗?

时间:2017-07-03 17:39:25

标签: java unit-testing recursion

以此功能为例:

public static int[] mergeSort(int[] array, int lo, int hi) {
        if (lo == hi) {
            return array;
        }
    int mid = (lo + hi) / 2;
    mergeSort(array, lo, mid);
    mergeSort(array, mid, hi);
    merge(array, lo, mid + 1, hi);

    return array;
}

正如您所看到的,我想在我的测试中模拟函数merge。 有可能吗?

2 个答案:

答案 0 :(得分:5)

可能。但这是错误的想法!

您想要测试排序方法。如果你认为你需要嘲笑你正在做一些严重错误的事情!

该方法接受一个数组并应该返回相同的数组 - 只是排序。

因此,您的测试应使用:传递数组 - 并检查输出是否符合预期!你绝对不在乎里面发生了什么。您专注于测试 -not 的完成方式。

所以你的测试看起来像是:

@Test
public void testReverseArray() {
  assertThat(Whatever.mergeSort(new int[] { 3, 2, 1 }), is(new int[] { 1, 2, 3 });
}
例如

(其中hamcrest matcher)。

换句话说:如果您认为必须“分解”对静态方法的调用 - 那么您可能正在这样做,因为调用真实方法会给您带来各种麻烦。

因此,在测试此方法时,您必须“模拟”它。但令人惊讶的是,当您测试调用外部mergeSort()方法的方法时,您还必须摆脱它。

因此:

  • 要非常小心使用 static 关键字
  • 一旦发现调用静态方法在单元测试中变成问题:将其视为必须重做该方法的明确证据

含义: static 调用应该被重写以允许在单元测试中调用它 - 或者你摆脱了 static 修饰符。

答案 1 :(得分:1)

谢谢你们, 我想要模拟的原因是:

让我们假设如下:

  • 此功能,merge(或任何)将用于100个功能
  • 合并被修改导致意外结果
  • 100次测试失败,因为merge失败。
  • 而不是让一个测试失败,那个测试merge功能的人,我们有100个测试失败,因为merge失败了。