В приложении, которое использует базу данных, будет хотя бы один компонент, который отвечает за связь с этой базой данных. Модульное тестирование для этого компонента может включать в себя фиктивную базу данных, но вполне допустимо (и часто желательно) тестировать компонент с использованием реальной базы данных. В конце концов, предполагается, что компонент инкапсулирует и обеспечивает посредничество в связи с этой базой данных - это должно проверить модульное тестирование. Существует множество стратегий для удобного выполнения таких модульных тестов - см. Список связанных вопросов SO на боковой панели для примеров.
Общее предписание избегать доступа к базам данных в модульных тестах применяется к не базам данных компонентов. Поскольку компоненты, не относящиеся к базе данных, обычно превосходят по количеству компоненты, связанные с базой данных, подавляющее большинство модульных тестов не должны включать базу данных. Действительно, если для таких компонентов, не связанных с базой данных, требуется база данных для эффективного тестирования, вероятно, существует проблема проектирования - возможно, неправильное разделение проблем.
Таким образом, принцип, согласно которому модульные тесты должны избегать баз данных, в целом верен, но не является абсолютным правилом. Это просто (сильное) руководство, которое помогает структурировать сложные системы. При слишком строгом соблюдении этого правила очень сложно адекватно протестировать «граничные» компоненты, которые инкапсулируют внешние системы - места, в которых ошибки очень легко спрятать! Итак, вопрос, который действительно нужно задавать себе, когда модульный тест требует базу данных, заключается в следующем: является ли тестируемый компонент законным доступом к базе данных напрямую, или он должен вместо этого сотрудничать с другим, который несет эту ответственность?
То же самое относится и к использованию внешних файлов и других ресурсов в модульных тестах.