Ho appena letto un estratto del libro "Crescere il software orientato agli oggetti" che spiega alcuni dei motivi per cui non si consiglia di deridere la classe concreta.
Ecco un codice di esempio di un test unitario per la classe 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());
}
}
E la sua prima spiegazione:
Il problema con questo approccio è che lascia implicita la relazione tra gli oggetti. Spero che ormai abbiamo chiarito che l'intenzione di Test-Driven Development con Mock Objects è scoprire relazioni tra oggetti. Se eseguo la sottoclasse, non c'è nulla nel codice di dominio che renda visibile tale relazione, solo metodi su un oggetto. Questo rende più difficile vedere se il servizio che supporta questa relazione potrebbe essere rilevante altrove e dovrò ripetere l'analisi la prossima volta che lavoro con la classe.
Non riesco a capire esattamente cosa significhi quando dice:
Questo rende più difficile vedere se il servizio che supporta questa relazione potrebbe essere rilevante altrove e dovrò ripetere l'analisi la prossima volta che lavoro con la classe.
Comprendo che il servizio corrisponde al MusicCentre
metodo chiamato startMediaAt
.
Cosa intende per "altrove"?
L'estratto completo è qui: http://www.mockobjects.com/2007/04/test-smell-mocking-concrete-classes.html