Один из способов, которыми я обычно решаю, использовать инъекцию зависимостей или нет, заключается в том, нужно ли мне макетировать или заглушать сотрудничающий класс при написании модульного теста для тестируемого класса. Например, в вашем примере вы (правильно) вводите DAO, потому что если вы пишете модульный тест для своего класса, вы, вероятно, не хотите, чтобы какие-либо данные фактически записывались в базу данных. Или, возможно, сотрудничающий класс записывает файлы в файловую систему или зависит от внешнего ресурса. Или поведение непредсказуемо или трудно объяснить в модульном тесте. В этих случаях лучше внедрить эти зависимости.
Для сотрудничающих классов, таких как TreeSet, я обычно не внедряю их, потому что обычно нет необходимости макетировать простые классы, подобные этим.
И последнее замечание: когда поле не может быть введено по какой-либо причине, но я все еще хотел бы смоделировать его в тесте, я обнаружил, что класс Junit-addons PrivateAccessor полезен для возможности переключите приватное поле класса на фиктивный объект, созданный EasyMock (или jMock или любым другим фреймворком, который вы предпочитаете).