Для выполнения простых тестов вполне допустимо использование уровня доступа к базе данных. Вы звоните getName(), он вызывает DAO, который был высмеян, и возвращает «Джон» для имени и «Смит» для фамилии, собирает их, и все идеально. Нет необходимости тестировать базу данных там.
Все становится немного больше, когда логика становится немного сложнее. Что делать, если у вас был метод "createOrUpdateUser (...)". Если вы смоделировали базу данных, вы можете проверить, что данный метод был вызван один раз с определенным параметром, когда макет не возвращает объектов, и другой метод вызывается в базе данных, когда он возвращает обратно существующий объект. Это начинает переходить к этой нечеткой строке, где может быть проще (особенно если оно уже было) развернуть специализированную базу данных в памяти и протестировать этот код с предварительно сконфигурированными данными.
В каком-то реальном коде, над которым я работал (точка продаж), у нас был resumeSuspededTransaction(...)метод. Это вытянет транзакцию из базы данных в объект (и его компоненты) и обновит базу данных. Мы высмеяли его, и где-то в коде скрывалась ошибка с сериализацией и десериализацией данных, поступающих в базу данных (мы изменили тип, который по-разному сериализовался в базе данных).
Макет не показал нам ошибку, потому что он возвращал свой счастливый путь - сериализовать транзакцию, сохранить ее в макете, десериализовать ее из макета, проверить, что они равны. Однако, когда вы сериализуете объект с начальным нулем в базе данных, он отбрасывает их, а затем рекомбинирует обратно в строку без нулей. Мы обнаружили ошибку без базы данных путем устранения неполадок (это было не так сложно обнаружить, когда мы узнали, что это было там).
Позже мы поместили туда базу данных и поняли, что ошибка не прошла бы через этот тест junit, если бы мы вместо этого шли в базу данных в памяти.
В базах данных памяти есть свои преимущества:
- их можно быстро раскрутить (без необходимости администратора базы данных для настройки учетных записей, таблиц и т. д.) для тестирования
- данные могут быть предварительно настроены для этого теста
- тесту не нужно беспокоиться об откате теста после его завершения
- Каждый тест имеет свою базу данных в памяти, поэтому вам не нужно беспокоиться, если два теста выполняются одновременно
- они могут быть запущены в системах, которые не имеют подключения к реальным базам данных