Вот мои 5 центов:
Как разработчик, я в основном пишу тесты для методов (в классе) в виде тестов белого ящика, просто потому, что я не хочу, чтобы мой тест ломался только потому, что я изменял внутреннюю работу своего кода.
Я хочу, чтобы мои тесты ломались только в случае изменения поведения моего метода (например, возвращает результат, отличный от предыдущего).
За последние 20 лет разработки я просто устал выполнять двойную работу только потому, что мои модульные тесты были сильно привязаны к коду, и мне нужно поддерживать как код приложения, так и тестовый код.
Я думаю, что создание разъединяющего кода (также когда вы тестируете код) - очень хорошая практика.
Еще 5 центов: я почти никогда не использую фальшивые фреймворки, потому что, когда я нахожу, что обязательно что-то имитирую, я вместо этого предпочитаю отделить свой код - и да, во многих случаях это очень возможно (особенно, если вы не работаете с унаследованным кодом ): -)