什么时候使用部分嘲笑?

时间:2008-09-26 14:11:00

标签: mocking

我开始对假货,短款,嘲笑和动态嘲笑的想法感到满意。但是我在理解何时使用部分嘲讽时仍然有点不确定。

看起来,如果你计划嘲笑服务并需要求助于部分模拟,那么它就是设计糟糕的标志。是否部分模拟主要用于获取测试覆盖范围内的遗留代码?

另一方面,假设我正在测试一个具有Reset()方法的类。如果我已经在单独的测试中确认Reset()方法有效,并且我有一些类的功能应该以调用此方法结束,那么测试设计的部分模拟和运行是否很差对部分模拟进行测试,在Reset()方法上定义Expectation。

我目前以这种方式设置了几个测试,这种事情会让我以后遇到麻烦吗?

4 个答案:

答案 0 :(得分:2)

它很好的设计,imho。如果有人来找你并更改你的方法,取消重置调用后会发生什么? (顺便说一句,为什么你的物体中存在如此多的状态?)你可能永远不会知道他们搞砸了,直到你投入生产。通过模拟它并在该方法调用上断言,您可以确保在维护代码时没有人会搞砸。

答案 1 :(得分:2)

在您的示例中,听起来Reset方法是一个实现细节,并且通过使用部分模拟,您将面临将测试与类的实现耦合的危险。这将使你的测试比它需要的更脆弱。

我还认为让一个对象拥有一些具有实际实现的方法和一些具有存根实现的对象会使测试更加混乱。当你稍后再次参加测试时,还需要记住一件事。

你能否(a)使用基于状态的测试来断言在内部调用真实Reset方法之后对象的状态如你所愿;或(b)使用基于交互的测试来验证是否由于真正的Reset方法而对协作对象进行了相关调用?

您可能会发现mockobjects.com中的Test Smell: Mocking concrete classes很有用。

答案 2 :(得分:1)

我对部分模拟的理解是,它是用于模拟抽象类,只有抽象方法被嘲笑,现有的具体方法保留原样?

答案 3 :(得分:1)

有人可能认为所有的模拟都是“部分的”,因为它们没有完全实现接口。当您尝试测试一个非常集中的功能时,您应该只模拟支持类的那些方面,这些方面是练习您正在测试的功能所必需的。

这将允许您的测试与其他测试分离,这很不错。