2008-09-26 32 views
7

我开始习惯假货,存根,嘲笑和动态模拟的想法。但是,在我理解何时使用部分模拟方面,我仍然有点不确定。何时使用部分模拟?

看起来,如果你打算嘲笑服务,并需要诉诸部分模拟,那么这是一个糟糕的设计的标志。部分模拟是否主要用于获取测试覆盖范围内的遗留代码?

另一方面,比如我正在测试一个具有Reset()方法的类。如果我已经在单独的测试中确认了Reset()方法的工作原理,并且我有一些应该以对此方法的调用结束的类的某些功能,那么对测试对象进行部分模拟并运行对部分模拟进行测试,在Reset()方法中定义期望值。

我目前有几种测试方式是以这种方式建立的,这种事情是否会让我陷入麻烦?

回答

1

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

2

它的好设计,恕我直言。当有人来到你身后并改变你的方法时,会发生什么情况,取消重置呼叫? (顺便说一句,为什么你的物体有这么多的状态?)你可能永远不知道他们搞砸了,直到你生产。通过嘲讽它并在该方法调用上断言,你可以确保没有人会在维护你的代码时搞砸了。

+0

请问,我不太明白你想说什么。我在问什么时候应该使用部分模拟而不是模拟工作。 – 2008-09-26 14:27:11

1

有人可能会争辩说,所有的嘲笑都是“部分”的,因为他们没有完全实现一个接口。当你试图测试一个非常有针对性的功能时,你应该只模拟支持这些类的方面,这些方面对于你正在测试的功能来说是必需的。

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

2

在你的例子中,它听起来像Reset方法是一个实现细节,并且通过使用部分模拟,你有可能将你的测试与类的实现耦合在一起。这会让你的测试比需要的更脆弱。

我也认为它使测试更混乱,有一个对象具有一些方法与真正的实现和一些存根实现。当你以后回来测试时,还需要记住一件事。

您可以(a)使用基于状态的测试来声明对象的状态与您在内部调用真实Reset方法后的预期相同;或(b)使用基于交互的测试来验证由于真正的Reset方法而导致对协作对象的相关调用?

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