Acabei de ler um trecho do livro "Growing Object-Oriented Software", que explica algumas razões pelas quais zombar de classes concretas não é recomendado.
Aqui estão alguns exemplos de código de um teste de unidade para a 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 sua primeira explicação:
O problema dessa abordagem é que ela deixa implícita a relação entre os objetos. Espero que tenhamos deixado claro até agora que a intenção do Desenvolvimento Orientado a Testes com o Mock Objects é descobrir relacionamentos entre objetos. Se eu subclasse, não há nada no código do domínio para tornar visível esse relacionamento, apenas métodos em um objeto. Isso torna mais difícil ver se o serviço que suporta esse relacionamento pode ser relevante em outro lugar e terei que fazer a análise novamente na próxima vez que trabalhar com a classe.
Não consigo descobrir exatamente o que ele quer dizer quando diz:
Isso torna mais difícil ver se o serviço que suporta esse relacionamento pode ser relevante em outro lugar e terei que fazer a análise novamente na próxima vez que trabalhar com a classe.
Entendo que o serviço corresponde ao MusicCentre
método chamado startMediaAt
.
O que ele quer dizer com "em outro lugar"?
O trecho completo está aqui: http://www.mockobjects.com/2007/04/test-smell-mocking-concrete-classes.html