Ich habe gerade einen Auszug aus dem Buch "Growing Object-Oriented Software" gelesen, in dem einige Gründe erläutert werden, warum das Verspotten einer konkreten Klasse nicht empfohlen wird.
Hier ein Beispielcode eines Unit-Tests für die MusicCentre-Klasse:
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());
}
}
Und seine erste Erklärung:
Das Problem bei diesem Ansatz besteht darin, dass die Beziehung zwischen den Objekten implizit bleibt. Ich hoffe, wir haben inzwischen klargestellt, dass die Absicht der testgetriebenen Entwicklung mit Scheinobjekten darin besteht, Beziehungen zwischen Objekten zu entdecken. Wenn ich eine Unterklasse habe, enthält der Domänencode nichts, was eine solche Beziehung sichtbar macht, sondern nur Methoden für ein Objekt. Dies macht es schwieriger zu erkennen, ob der Dienst, der diese Beziehung unterstützt, an anderer Stelle relevant sein könnte, und ich muss die Analyse beim nächsten Arbeiten mit der Klasse erneut durchführen.
Ich kann nicht genau herausfinden, was er meint, wenn er sagt:
Dies macht es schwieriger zu erkennen, ob der Dienst, der diese Beziehung unterstützt, an anderer Stelle relevant sein könnte, und ich muss die Analyse beim nächsten Arbeiten mit der Klasse erneut durchführen.
Ich verstehe, dass der Dienst der MusicCentre
aufgerufenen Methode entspricht startMediaAt
.
Was meint er mit "anderswo"?
Der vollständige Auszug ist hier: http://www.mockobjects.com/2007/04/test-smell-mocking-concrete-classes.html