根据我的经验,使用模拟对象可以实现的任何事情都可以使用存根来实现。是否存在无法使用存根且模拟对象运行良好的情况。
答案 0 :(得分:4)
模拟通常包括检查方法是否已被调用的功能,而存根只返回存根数据。有关详细信息,请参阅differences between faking, mocking, and stubbing上的问题。
答案 1 :(得分:2)
Martin Fowler对他bliki
的差异进行了很好的描述答案 2 :(得分:1)
Stubs是测试中实际协作者的替身/双重对象,并为某些请求提供固定答案。短裤通常是手工制作的。这意味着如果你虔诚地遵循这种方法,你最终可能会维护(繁琐?)很多虚假物品。
另一方面,模拟通常是动态的 - 您不保留这些测试双打的来源。相反,您使用模拟框架,该框架在运行时实现特定接口的模拟实现。模拟允许你指定期望(这些方法应该在这个序列中调用,使用这些参数,当它们是,返回这些值)和验证它们在测试结束。简短回答:谨慎使用存根来克服轻微障碍,因为您对协作者的互动不感兴趣但只是希望将其从方式的测试。 使用模拟进行基于交互的测试 - 您对SUT和模拟协作者的互动方式感兴趣。