Модульное тестирование должно быть сосредоточено на тестировании юнитов. PostgreSQL является внешним по отношению к вашему приложению и, таким образом, тривиально не является частью какого-либо DAO, который его использует: не следует писать «модульный тест», который использует любую такую внешнюю базу данных.
Использование базы данных для интеграционных тестов может быть нормальным, но, как вы уже заметили, могут возникнуть многочисленные проблемы, когда вы используете другую базу данных для выполнения интеграционных тестов (я знаю очень мало приложений, которые используют только ANSI-SQL без каких-либо триггеров или других поставщиков). конкретные расширения SQL, такие как UPSERT
в случае PostgreSQL или SQL в вашем сообщении.
Так что, если ваша производственная база тоже находится в памяти? Это довольно сложно, и я бы поспорил, что интеграционный тест будет в порядке, просто не называйте его модульным тестом. Все это лишь подчеркивает болевые точки выполнения бизнес-логики в вашей базе данных (например, с помощью триггеров, которые вы сейчас не можете протестировать) или использования специфичного для поставщика sql, что имеет ряд преимуществ, которые не очень хорошо работают при смене основного поставщика базы данных.