Acabo de leer un extracto del libro "Crecimiento de software orientado a objetos" que explica algunas razones por las cuales no se recomienda burlarse de la clase concreta.
Aquí hay un código de muestra de una prueba unitaria para la clase 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());
}
}
Y su primera explicación:
El problema con este enfoque es que deja implícita la relación entre los objetos. Espero que ya hayamos aclarado que la intención del desarrollo basado en pruebas con objetos simulados es descubrir relaciones entre objetos. Si subclase, no hay nada en el código de dominio para hacer visible dicha relación, solo métodos en un objeto. Esto hace que sea más difícil ver si el servicio que respalda esta relación podría ser relevante en otro lugar y tendré que volver a hacer el análisis la próxima vez que trabaje con la clase.
No puedo entender exactamente lo que quiere decir cuando dice:
Esto hace que sea más difícil ver si el servicio que respalda esta relación podría ser relevante en otro lugar y tendré que volver a hacer el análisis la próxima vez que trabaje con la clase.
Entiendo que el servicio corresponde al MusicCentre
método llamado startMediaAt
.
¿Qué quiere decir con "en otro lugar"?
El extracto completo está aquí: http://www.mockobjects.com/2007/04/test-smell-mocking-concrete-classes.html