Unit testing 什么时候在单元测试中使用模拟对象而不是使用存根?

Unit testing 什么时候在单元测试中使用模拟对象而不是使用存根?,unit-testing,testing,Unit Testing,Testing,根据我的经验,任何可以用模拟对象实现的东西都可以用存根实现。是否存在存根无法使用且模拟对象服务良好的场景。模拟通常包括检查方法是否已被调用的功能,而存根只返回存根数据。有关更多信息,请参阅上的问题。模拟通常包括检查方法是否已被调用的功能,而存根只返回存根数据。有关更多信息,请参见我的问题。Martin Fowler在他的中很好地描述了差异。Martin Fowler在他的中很好地描述了差异。存根是在您的测试中为实际协作者准备的对象,并为某些请求提供了固定答案。存根通常是手工制作的引导。这意味着,

根据我的经验,任何可以用模拟对象实现的东西都可以用存根实现。是否存在存根无法使用且模拟对象服务良好的场景。

模拟通常包括检查方法是否已被调用的功能,而存根只返回存根数据。有关更多信息,请参阅上的问题。

模拟通常包括检查方法是否已被调用的功能,而存根只返回存根数据。有关更多信息,请参见我的问题。

Martin Fowler在他的

中很好地描述了差异。Martin Fowler在他的

中很好地描述了差异。存根是在您的测试中为实际协作者准备的对象,并为某些请求提供了固定答案。存根通常是手工制作的引导。这意味着,如果你虔诚地遵循这种方法,你最终可能会维护(乏味的?)很多假对象

另一方面,mock通常是动态的——您不维护这些双重测试的源代码。相反,您使用模拟框架,该框架在运行时提供特定接口的模拟实现。模拟允许您指定期望值(应按此顺序使用这些参数调用这些方法,并在调用时返回这些值),并验证在测试结束时是否满足这些期望值


简短回答谨慎使用存根来克服一些小障碍,在这些小障碍中,您对与合作者的互动不感兴趣,而只是希望避开测试的阻碍使用模拟进行基于交互的测试-您对SUT和模拟的协作者如何交互感兴趣

存根是测试中实际协作者的替身/替身对象,并为某些请求提供固定答案。存根通常是手工制作的引导。这意味着,如果你虔诚地遵循这种方法,你最终可能会维护(乏味的?)很多假对象

另一方面,mock通常是动态的——您不维护这些双重测试的源代码。相反,您使用模拟框架,该框架在运行时提供特定接口的模拟实现。模拟允许您指定期望值(应按此顺序使用这些参数调用这些方法,并在调用时返回这些值),并验证在测试结束时是否满足这些期望值


简短回答谨慎使用存根来克服一些小障碍,在这些小障碍中,您对与合作者的互动不感兴趣,而只是希望避开测试的阻碍使用模拟进行基于交互的测试-如果您对SUT和模拟的合作者如何交互感兴趣

我认为术语“模拟对象”和“存根”是相当主观和模糊的。你能告诉我你认为两者的区别是什么吗?:)Wikipedia:“方法存根,在计算机编程中,一段代码,用来代表一些其他编程功能”//“模拟对象,以受控方式模拟真实对象行为的模拟对象”:@Meeh-搜索马丁·福勒值得阅读的“模拟对象不是存根”文章我认为术语“模拟对象”和“存根”是相当主观和模棱两可的。你能告诉我你认为两者的区别是什么吗?:)维基百科:“方法存根,在计算机编程中,一段代码,用于代表其他编程功能”//“模拟对象,以受控方式模拟真实对象行为的模拟对象”:@Meeh-搜索Martin Fowler值得阅读的“模拟对象不是存根”文章,这篇文章的解释切中要害。谢谢你回答这个问题。你推荐任何博客或文章吗?下面由AutomatedTester链接的帖子是你可以开始的。理解基于状态和基于交互的测试之间的区别。这就是最重要的解释。谢谢你回答这个问题。你推荐任何博客或文章吗?下面由AutomatedTester链接的帖子是你可以开始的。了解基于状态和基于交互的测试之间的区别。