在支持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,并且通过@PersistenceContext注入EntityManager很困难,因为所需的包unitils-orm依赖于Spring 2.5和JPA 1.0导致其他问题。
相反,我创建了EntityManagerService并验证它确实使用了与TerminalService相同的EntityManager。
我尝试过EntityManager.clear()和flush()并从EntityManagerFactory驱逐Cache - 但似乎没有任何效果。
有什么建议吗?
答案 0 :(得分:1)
目前尚不清楚如何管理交易。由于clear()
没有帮助,可能两个检查都在同一事务中执行,该事务看不到REST服务提交的事务结果。
尝试在不同的交易中执行检查。