相同点

stub和mock都是为了配合测试,对被测程序所依赖的单元的模拟。

简单说,为了测函数A,但A有引用到了函数B,通过模拟B的一些状态或行为测试A。

区别

  1. stub基于状态,mock基于行为
  2. stub难于维护
  3. mock有对本身的调用验证

stub是基于状态,mock是基于行为。

mock通常通过一些成熟的框架对类或方法进行模拟。通常的流程是:

创建指定类的mock,指定输入返回对应的响应内容。

当被测函数调用到该mock时针对输入进行预期返回。

最后验证该mock是否被调用。

而使用stub时针对每个状态,返回指定的响应。比如在Junit4 in action第6章为了测试getContent,分别模拟了几种状态:

private class TestGetContentOkHandler extends AbstractHandler {}
private class TestGetContentServerErrorHandler extends AbstractHandler {}
private class TestGetContentNotFoundHandler extends AbstractHandler {}

选择stub还是mock

其实可以看到现在mock大张旗鼓,而stub却少看到也可以看出一些差别。

stub往往也要去实现处理逻辑,如果B较简单,可能直接就用实现的程序来验证了。

复杂的又难于实现,用mock或许更容易些。

还有一种情况是当基于状态的实现难于模拟的时候或许有必要切换思维。

毕竟,我们的目标只是为了测试被测单元。