何时使用部分模拟?

时间:2020-03-06 14:47:10  来源:igfitidea点击:

我开始对假货,存根,模拟和动态模拟的想法感到满意。但是对于何时使用部分模拟的理解,我还是有些疑惑。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

似乎,如果我们打算对服务进行模拟,并且需要诉诸部分模拟,那么这表明设计不良。是部分模拟主要用于使遗留代码处于测试覆盖范围内吗?

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

我目前以这种方式进行了几次测试,这种事情以后会让我感到麻烦吗?

解决方案

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

它的好设计,恕我直言。当有人跟随我们并更改方法,取消对Reset的调用时,会发生什么情况? (顺便说一句,为什么对象中存在如此多的状态?)我们可能永远不知道它们会被破坏,直到我们开始生产。通过对其进行模拟并在该方法调用中进行断言,可以确保在维护代码的过程中不会有人搞砸。

有人可能会说所有模拟都是"部分的",因为它们没有完全实现接口。当我们尝试测试非常集中的功能时,我们应该仅模拟那些支持类的方面,这些方面对于行使我们正在测试的功能是必需的。

这将使测试与其他测试脱钩,这很好。

在示例中,听起来" Reset"方法是一个实现细节,并且通过使用部分模拟,我们有将测试耦合到类的实现的危险。这会使测试变得比所需的更脆弱。

我还认为,使一个对象具有一些具有实际实现的方法和一些具有存根实现的方法,会使测试更加混乱。稍后再返回测试时,要记住的只是一件事。

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

我们可能会发现Test Smell:模拟来自嘲笑对象(mockobjects.com)的具体类。