我刚刚读了《成长面向对象的软件》一书的摘录,其中解释了为什么不建议模拟具体类的一些原因。
以下是MusicCentre类的单元测试的一些示例代码:
public class MusicCentreTest {
@Test public void startsCdPlayerAtTimeRequested() {
final MutableTime scheduledTime = new MutableTime();
CdPlayer player = new CdPlayer() {
@Override
public void scheduleToStartAt(Time startTime) {
scheduledTime.set(startTime);
}
}
MusicCentre centre = new MusicCentre(player);
centre.startMediaAt(LATER);
assertEquals(LATER, scheduledTime.get());
}
}
和他的第一个解释:
这种方法的问题在于,它使对象之间的关系保持隐式。我希望我们现在已经弄清楚了,使用模拟对象进行测试驱动开发的目的是发现对象之间的关系。如果我是子类,则域代码中没有任何东西可以使这种关系可见,而只是对象上的方法。这使得很难看到支持这种关系的服务是否在其他地方有用,下次我与该类一起工作时,我将不得不再次进行分析。
他说的时候我无法确切知道他的意思:
这使得很难看到支持这种关系的服务是否在其他地方有用,下次我与该类一起工作时,我将不得不再次进行分析。
我了解该服务对应于MusicCentre
称为的方法startMediaAt
。
他在“其他地方”是什么意思?
完整的摘录在这里:http : //www.mockobjects.com/2007/04/test-smell-mocking-concrete-classes.html