Но мой вопрос в крупных проектах
где каждый класс зависит от многих
другие классы, как вы идете о блоке
тестирование класса?
Во-первых, вы понимаете, что "каждый класс зависит от многих других классов" - это плохо, верно? И что это не функция большого проекта, а скорее плохой дизайн? (Это одно из преимуществ TDD в том, что он препятствует такому высокосвязанному коду.)
Уничтожение любого другого класса не
имеет большой смысл из-за обоих
сложность и время, необходимое для
написать заглушки.
Не говоря уже о том, что это не помогает проблеме дизайна. Хуже того, инвестиции во все заглушки могут стать препятствием для рефакторинга, пусть даже психологическим.
Лучший подход (ИМХО) - начинать с занятий изнутри, изменяя дизайн по ходу дела. Обычно я подхожу к этому, делая то, что я называю «инъекцией внутренней зависимости». Это включает в себя оставление сигнатур метода без изменений, но извлечение необходимых данных из зависимостей и затем извлечение функций, которые содержат действительную логику. Тривиальный пример может быть:
public int foo(A a, B b) {
C c = a.getC();
D d = b.getD();
Bar bar = calculateBar(c, d);
return calculateFoo(bar, this.baz);
}
Bar calculateBar(C c, D d) {
...
}
int calculateFoo(Bar bar, Baz baz) {
...
}
Теперь я могу написать тест для CalculateBar и CalculateBaz, но мне не нужно беспокоиться о настройке внутренних состояний (this.baz) и мне не нужно беспокоиться о создании фиктивных версий A и B.
После создания подобных тестов с существующими интерфейсами, я ищу возможность протолкнуть изменения в интерфейс, например, изменить метод Foo на C и D вместо A и B.
Что-нибудь из этого имеет смысл?