在集成测试中强制“重新加载”JPA EntityManager

时间:2011-07-22 11:59:42

标签: jpa entitymanager

在支持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 - 但似乎没有任何效果。

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

目前尚不清楚如何管理交易。由于clear()没有帮助,可能两个检查都在同一事务中执行,该事务看不到REST服务提交的事务结果。

尝试在不同的交易中执行检查。