Проблема:
При запуске тестов я получаю следующую ошибку во втором и последующих примерах тестовых сценариев:
Код: Выделить всё
javax.persistence.PersistenceException: org.hibernate.exception.GenericJDBCException: could not execute statement ... Caused by: org.postgresql.util.PSQLException: ERROR: cache lookup failed for type 18049
Код: Выделить всё
public void persistAndRefresh(@NonNull Entity object) {
persist(object); // Error happens at this line on the second test run
entityManager.flush();
entityManager.refresh(object);
}
Тесты. Для написания тестов я использую Cucumber. Каждый тест имеет несколько примеров (примеры).
Контейнеры тестов: мы разворачиваем один контейнер PostgreSQL/PostGIS для всех тестов, а для каждого теста создаем дамп и восстанавливаем базу данных с помощью контейнеров тестов. Контейнер использует образ PostGIS:
Код: Выделить всё
private static final DockerImageName POSTGIS_IMAGE = DockerImageName
.parse("postgis/postgis:16-3.4")
.asCompatibleSubstituteFor("postgres");
Первый пример сценария выполняется успешно.
Во втором примере того же теста возникает ошибка. при вызове persist(object) (в начале persistAndRefresh).
Обходное решение: если мы вызываем метод, который извлекает все записи из таблицы (например, getAll()) перед сохранением объект, ошибка не возникает. Вот пример того, как мы работаем над решением этой проблемы:
Код: Выделить всё
geofenceClient.getAll(token).as(List.class); // No error if this is called before persisting
persist(object); // The error disappears after calling getAll()
Очистка контекста после каждый тест: после каждого теста мы очищаем контекст теста и восстанавливаем дамп базы данных, используя следующий код:
Код: Выделить всё
@After
public void cleanUp() {
// Clear test contexts
testContexts.stream().forEach(testContexts::destroy);
// Restore the database from the dump
PostgresResource.restoreDump();
// Clear the time context
DateTimeProvider.clearContext();
Подробнее здесь: https://stackoverflow.com/questions/790 ... -when-pers