whirlwind
TDD infected, paranoid
Я сильно углубляться не буду, но вот смотри по верхам. RouteDispatcher хороший пример демонстрации отсутствия проблемы. Есть у тебя контроллер. Под ним нет никакой инфраструктуры. Для него по сути фабрика нужна что бы по имени класс инстанцировать - все. Где DI тут? Полиморфизм не нужен. С другой стороны, роутер не требует контракта от контроллера. То есть, с этой стороны полиморфизм тоже не нужен. Отсюда следует, что вы там все можете зафайналить и никто не пострадает.Не знаю насчет Вурдалака, у меня и такие, и такие, в зависимости от. Раз ты уж так привязался к show me the code, ну вот такая фигня на гитхабе валяется.
Дальше. Честный тест на dispatch не сделан. Посчитай количество взаимоисключающих ветвей внутри форыча и возведи в квадрат минимум (минимум 2 элемента = 2 прохода), что бы обозначить работу цикла. Что бы тестить жирные циклы нужно тело цикла выносить за контрактный метод (назовем этот контракт хелпером) и отдельно тестировать 2 кейса: когда код идет по циклу, а отдельно тестить один проход по циклу (тест логики обработки элемента). Если обе части покрыты на 100%, значит и в комбинации они работают правильно. Но общий тест без выноса будет очень сложен, что и демонстрирует твой тест. И смотрим опять: DI нет, 100% покрытия нет. Нет DI, нет понимания что это внутренний дизайн и лепить тут implements на класс логики обработки элемента бессмыслено. Этот хелпер класс должен быть package visible, а юзер (диспатчер в данном случае) будет предусматривать два конструктора: package visible с возможностью инжектнуть мокнутый хелпер и дефолтный конструктор, который инстанцирует реальный хелпер.
Ну и так далее по тексту.