7

我开始对假货、存根、模拟和动态模拟的想法感到满意。但是我对何时使用部分模拟的理解仍然有些不确定。

如果您打算模拟一项服务并且需要使用部分模拟,那么这似乎是设计不佳的标志。是否部分模拟主要用于在测试覆盖范围内获取遗留代码?

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

我目前有几个以这种方式设置的测试,这种事情以后会给我带来麻烦吗?

4

4 回答 4

2

Its good design, imho. What happens when somebody comes after you and changes your method, removing the call to Reset? (btw, why so much state in your objects?) You might never know they screwed up until you hit production. By mocking it and asserting on that method call, you can assure nobody is going to mess up while maintaining your code.

于 2008-09-26T14:22:12.327 回答
2

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

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

您是否可以(a)使用基于状态的测试来断言在Reset内部调用真实方法后对象的状态与您期望的一样;或者 (b) 使用基于交互的测试来验证对协作对象的相关调用是否已作为真实Reset方法的结果进行?

您可能会发现来自 mockobjects.com 的Test Smell: Mocking 具体类很有用。

于 2008-12-18T18:17:04.463 回答
1

One could argue that all mocks are 'partial' in that they do not fully implement an interface. As you are trying to test a very focused piece of functionality, you should only mock those aspects of supporting classes that are necessary to exercise the piece of functionality you are testing.

This will allow your test to be decoupled from other tests, which is nice.

于 2008-09-26T14:36:48.843 回答
1

我对部分mock的理解是,它是用来mock抽象类的,只mock抽象方法,而保留现有的具体方法?

于 2008-09-26T14:14:01.817 回答