Мок репозитория проверяет вызовы сценария, но не SQL, типы и ограничения. Для них нужен настоящий PostgreSQL в изолированном окружении.
База того же типа
Testcontainers поднимает отдельный PostgreSQL на прогон. DataSource подключается к нему, накатывает миграции и использует обычный production-путь создания сущностей.
Проверка выглядит так:
- Поднять контейнер и применить миграции.
- Подключить DataSource с
synchronize: false. - Выполнить сценарий.
- Прочитать результат независимым запросом или свежим manager.
- Закрыть DataSource и контейнер.
SQLite не заменяет PostgreSQL: numeric, jsonb, блокировки, FOR UPDATE, isolation и планы запросов отличаются.
Что проверять
numericиbigintпосле чтения имеют ожидаемый тип и точность.- Откат оставляет и заказ, и outbox незаписанными.
- Уникальное ограничение не дает дубль идемпотентности.
- Две параллельные транзакции не теряют изменение версии.
- Миграция поднимается на пустой и на уже заполненной базе.
Для гонки запускают два сценария одновременно и проверяют итог, а не порядок логов. Тест должен быть детерминированным: фиксированные данные, часы и идентификаторы через явные зависимости.
Коротко
- Типы и SQL проверяют на PostgreSQL того же класса, что в production.
- Миграции применяют в тесте, synchronize не используют.
- Откат и гонки проверяют результатом, а не моком.
- DataSource и контейнер закрывают после прогона.
- Часы и ID контролируют через зависимости.
Что почитать дальше
- Блокировки и версии - сценарии параллельных изменений.
- Миграции - что проверять до выката.