публичный контракт объекта тестирования (т. Е. Тестирование черного ящика, о котором вы упоминали) в большинстве случаев должно быть достаточно.Надлежащее тестовое покрытие публичных членов должно также выполнять большинство частных / внутренних органов.В конце концов, зачем пользователю вашего класса (будь то другой программист, другие объекты / соавторы) заботиться о том, что ваши объекты делают внутри ?
Когда вы достигаете точки, когда вы чувствуете острую потребность в тестировании внутренних органов, рассматривайте это как возможность для улучшения.Обычно такая необходимость является результатом того, что ваш код сообщает вам что-то - "возможно, я не должен быть частным" , "возможно, это стоитрефакторируйте меня в отдельное существо ".
Также имейте в виду, что внутреннее тестирование делает ваши тесты более хрупкими .Хотя функциональность вашего объекта / класса (контракт) может остаться прежней, реализация может меняться довольно часто.Подумайте о том, чтобы заменить свои собственные фрагменты кода сторонними / внешними библиотеками (довольно распространенное изменение) - это причина для того, чтобы ломать ваши тесты?Это не так.
Я понимаю, что иногда вам просто нужно протестировать внутреннее устройство - но IMO, тогда лучше остановиться и подумать, сможете ли вы улучшить свой код (очень часто вы узнаете, что действительно можете!),Относитесь к тестированию внутренних органов как к последнему средству, когда все остальное не помогло.