В вопросе конкретно упоминается «тестирование белого ящика». Именно здесь ваши тесты обладают глубокими знаниями о внутренней структуре вашего кода и утверждают поведение на каждом шаге, а не только ввод / вывод / побочный эффект (тестирование черного ящика). Несмотря на то, что JUnit отлично подходит для обеих задач, вам нужны дополнительные дополнительные платформы, чтобы сделать это в контексте модульного теста.
EasyMock и JMock - хорошие рамки для этого. Я склоняюсь в пользу JMock.
Рискуя начать дебаты по ОТ, вы должны тщательно подумать о последствиях тестирования белого ящика. Тесты «белого ящика» тесно связаны с вашим кодом (очевидно), и, если не использовать их осторожно, фреймворк-фреймворки могут сделать ваши тесты довольно сложными, трудными для чтения и, как правило, более хрупкими при рефакторинге.
Я склонен придерживаться обоих. Тесты «черного ящика», где это возможно, и тесты «белого ящика», экономно применяемые к более рискованному / более сложному коду.
Конечно, вышеперечисленные структуры также можно использовать в тестах черного ящика, где число участвующих (внедряемых) классов велико, а простая заглушка становится громоздкой.
Что касается TDD - это прежде всего подход к написанию кода, улучшающий дизайн, а не просто способ написания тестов. Тесты, которые у вас есть в конце, являются важным результатом, но, кроме того, этот подход призван улучшить дизайн и структуру вашего приложения.