Je viens de lire un extrait du livre "Growing Object-Oriented Software" qui explique certaines raisons pour lesquelles se moquer de la classe concrète n'est pas recommandé.
Voici un exemple de code d'un test unitaire pour 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());
}
}
Et sa première explication:
Le problème avec cette approche est qu'elle laisse implicitement la relation entre les objets. J'espère que nous avons maintenant clairement indiqué que l'intention du développement piloté par les tests avec des objets fantômes est de découvrir les relations entre les objets. Si je sous-classe, il n'y a rien dans le code de domaine pour rendre une telle relation visible, juste des méthodes sur un objet. Cela rend plus difficile de voir si le service qui prend en charge cette relation pourrait être pertinent ailleurs et je devrai refaire l'analyse la prochaine fois que je travaillerai avec la classe.
Je ne peux pas comprendre exactement ce qu'il veut dire quand il dit:
Cela rend plus difficile de voir si le service qui prend en charge cette relation pourrait être pertinent ailleurs et je devrai refaire l'analyse la prochaine fois que je travaillerai avec la classe.
Je comprends que le service correspond à MusicCentre
la méthode appelée startMediaAt
.
Que veut-il dire par «ailleurs»?
L'extrait complet est ici: http://www.mockobjects.com/2007/04/test-smell-mocking-concrete-classes.html