В интеграционном тесте с поддержкой Spring мне нужно заставить EntityManager повторно читать из базы данных.
@Test
@DataSet("/xml/dbunit/truncate-tables.xml")
public void createTerminalFromQuery() {
// there should be zero terminals in the empty database
Assert.assertEquals(0, terminalService.countTerminals());
// makes remote REST call updating database outside the application's EntityManager
HttpEntity<QueryResponse> result = simulateRequest("query");
// attempts to force re-read of updated database (unsuccessfully)
entityManagerService.getEntityManager().flush();
// there should be exactly one Terminal in the database
Assert.assertTrue(terminalService.existsTerminalBySerialNumber(EXISTING_TERMINAL_SERIAL_NUMBER));
}
Проверено, что Терминал создан и существует в базе данных. Несмотря на это, второе утверждение неверно. Когда первое утверждение закомментировано, второе в порядке.
Тестовая среда — это Unitils/DBUnit, и внедрение EntityManager через @PersistenceContext затруднено, так как требуемый пакет unitils-orm зависит от Spring 2.5 и JPA 1.0, что приводит к другим проблемам.
Вместо этого я создал EntityManagerService и убедился, что он действительно использует тот же EntityManager, что и TerminalService.
Я пробовал EntityManager.clear() и flush() и вытеснял кэш из EntityManagerFactory, но, похоже, ничего не дало никакого эффекта.
Какие-либо предложения?