Я только что прочитал отрывок из книги «Растущее объектно-ориентированное программное обеспечение», в которой объясняются некоторые причины, по которым не рекомендуется издеваться над конкретным классом.
Вот пример кода юнит-теста для класса 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());
}
}
И его первое объяснение:
Проблема этого подхода заключается в том, что он оставляет отношения между объектами неявными. Я надеюсь, что к настоящему времени мы ясно дали понять, что намерение разработки через тестирование с помощью Mock Objects состоит в обнаружении взаимосвязей между объектами. Если я создаю подкласс, в коде домена нет ничего, что могло бы сделать такие отношения видимыми, только методы объекта. Из-за этого становится сложнее понять, может ли служба, поддерживающая эти отношения, быть релевантной в другом месте, и мне придется снова провести анализ в следующий раз, когда я буду работать с классом.
Я не могу понять, что именно он имеет в виду, когда говорит:
Из-за этого становится сложнее понять, может ли служба, поддерживающая эти отношения, быть релевантной в другом месте, и мне придется снова провести анализ в следующий раз, когда я буду работать с классом.
Я понимаю, что сервис соответствует MusicCentre
российскому методу startMediaAt
.
Что он подразумевает под «в другом месте»?
Полный отрывок находится здесь: http://www.mockobjects.com/2007/04/test-smell-mocking-concrete-classes.html