← назад к разделу

Мок репозитория проверяет вызовы сценария, но не SQL, типы и ограничения. Для них нужен настоящий PostgreSQL в изолированном окружении.

База того же типа

Testcontainers поднимает отдельный PostgreSQL на прогон. DataSource подключается к нему, накатывает миграции и использует обычный production-путь создания сущностей.

Проверка выглядит так:

  1. Поднять контейнер и применить миграции.
  2. Подключить DataSource с synchronize: false.
  3. Выполнить сценарий.
  4. Прочитать результат независимым запросом или свежим manager.
  5. Закрыть DataSource и контейнер.

SQLite не заменяет PostgreSQL: numeric, jsonb, блокировки, FOR UPDATE, isolation и планы запросов отличаются.

Что проверять

  • numeric и bigint после чтения имеют ожидаемый тип и точность.
  • Откат оставляет и заказ, и outbox незаписанными.
  • Уникальное ограничение не дает дубль идемпотентности.
  • Две параллельные транзакции не теряют изменение версии.
  • Миграция поднимается на пустой и на уже заполненной базе.

Для гонки запускают два сценария одновременно и проверяют итог, а не порядок логов. Тест должен быть детерминированным: фиксированные данные, часы и идентификаторы через явные зависимости.

Коротко

  • Типы и SQL проверяют на PostgreSQL того же класса, что в production.
  • Миграции применяют в тесте, synchronize не используют.
  • Откат и гонки проверяют результатом, а не моком.
  • DataSource и контейнер закрывают после прогона.
  • Часы и ID контролируют через зависимости.

Что почитать дальше