Лично мой подход заключается только в тестировании работоспособности, поэтому вы в конечном итоге тестируете только хорошо инкапсулированные детали.
Это обычно приводит к тому, что мой дизайн содержит небольшие классы с четко определенной функциональностью, которые легче тестировать.
Как правило, при модульном тестировании вы не должны беспокоиться о внутренностях того, что тестируете, поэтому я считаю, что это лучший способ приблизиться к нему.
Я также согласен, что лучше всего разделить тестовый и производственный код.