以此功能为例:
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
。
有可能吗?
答案 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 修饰符。
答案 1 :(得分:1)
谢谢你们, 我想要模拟的原因是:
让我们假设如下:
merge
(或任何)将用于100个功能merge
失败。merge
功能的人,我们有100个测试失败,因为merge
失败了。