white box тесты это антипаттерн. Точка. Просто их быть не должно.
То что ты в "тесте" зависимость подставляешь - это не значит что ты "открываешь" ящик. Ты просто предоставляешь зависимость. Ровно так же как в любых других тестах. Никакой разницы. Если ты детали реализации в тесты добавляешь это твои проблемы
box черный или там белый или зеленый - это интерфейс, контрак. Все. "дублирование реализации" это плохо потому что ты реально ничего не тестишь. Но это не значит что юнит тесты должны быть такими.
чаще это проблемы дизайна системы и "лень" - вроде "у меня есть зависимость с 100 методами и я застаблю только один и еще сделаю ассерт что он вызвался" - эт просто про хуевые тесты
нет разницы подменяешь ты пэймент гейтвей на сэндбокс для E2E. подменяешь ты внешний сервис на мок сервер в компонентых тестах или предоставляешь ли ты заглушку в юнит тесте.
Ну типа при e2e ты зависишь от якорей в DOM например. Реализации можешь менять, как перчатки, тесты менять не придётся. Другое дело взять мелкий модуль на 2-3 класса. Там при изменении реализации может придётся попрощаться с тестами.
Такой вариант. Я пишу штуку (агрегат whatever) для write части. У него контракт только для собственно изменения (логично). Как мне ассертить что что-то произошло? Расширять контракт чтением ради тестов или хукаться рефлексией?)
при изменении реализации - нет. при изменении контрактов - возможно. Но кто мешает делать систему таким образом что бы контракты не менялись и просто появлялись новые)