• Stubs : Stubs通常用于在测试中提供封装好的响应,譬如有时候编程设定的并不会对所有的调用都进行响应。Stubs也会记录下调用的记录,譬如一个email gateway就是一个很好的例子,它可以用来记录所有发送的信息或者它发送的信息的数目。简而言之,Stubs一般是对一个真实对象的封装。

    Mocks : Mocks即是针对设定好的调用方法与需要响应的参数封装出合适的对象。【2】

  • 简单说就是你可以用stub去伪造(fade)一个方法,阻断对原来方法的调用

    简单来说mock就是stub + expectation, 说它是stub是因为它也可以像stub一样伪造方法,阻断对原来方法的调用, expectation是说它不仅伪造了这个方法,它还期望你(必须)调用这个方法,如果没有被调用到,这个test就fail了【1】

  • 一个完美的解决的方案是,我们人为地来指定计算的结果,然后测试数据库的写入操作。人为地让一个对象对某个方法返回我们事先规定好的值,这就叫做 stub。

    mock 是一个非常容易和 stub 混淆的概念。简单来说,我们可以将 mock 看做是一种更全面和更智能的 stub。
    首先解释全面,我们需要明确,mock 其实就是一个对象,它是对现有类的行为一种模拟(或是对现有接口实现的模拟)。在 objc 的 OOP 中,类或者接口就是指导对象行为的蓝图,而 mock 则遵循这些蓝图并模拟它们的实例对象。从这方面来说,mock 与 stub 最大的区别在于 stub 只是简单的方法替换,而不涉及新的对象,被 stub 的对象可以是业务代码中真正的对象。而 mock 行为本身产生新的(不可能在业务代码中出现的)对象,并遵循类的定义相应某些方法。

    其次是更智能。基础上来说,和 stub 很相似,我们可以为创造的 mock 定义在某种输入和方法调用下的输出,更进一步,我们还可以为 mock 设定期望 (准确来说,是我们一定会为 mock 设定期望,这也是 mock 最常见的用例)。即,我们可以为一个 mock 指定这样的期望:“这个 mock 应该收到以 X 为参数的 Y 方法,并规定它的返回为 Z”。其中”应该收到以 X 为参数的 Y 方法”这个期望会在测试与其不符合时让你的测试失败,而“返回 Z” 这个描述行为更接近于一种 stub 的定义。【3】


    理解:Stub是类方法的封装,起替换作用,无状态;Mock类是真实类的抽象实现,从而模拟了原来的类,而调用者不知道对象是真的还是模拟的,从而使测试继续进行下去。Mock测试中不应该对被测试代码的逻辑过程有任何实际的变动,Mock对象只能是模拟某个类的调用而已。

    引用链接:

    [1]、http://williamherry.com/blog/2013/05/13/understand-stub-and-mock/

    [2]、https://segmentfault.com/a/1190000004936516

    [3]、https://onevcat.com/2014/05/kiwi-mock-stub-test/