【发布时间】:2011-08-09 18:05:38
【问题描述】:
编写所有访问数据库(通过 JPA+Hibernate)以便它们可以并行运行的单元测试我需要知道什么?我们开始使用 maven 的并行单元测试功能,并体验了在单线程中运行时不会发生的测试失败。
我将给出一个简短的示例,我们现在是如何编写测试的。我们在@Before 中设置EntityManager 和其他类,开始事务,最后插入我们在类中的所有测试需要的测试数据(测试特定数据在测试中创建)。 @After 测试运行,我们通过调用 Transaction.rollback(); 和 null 所有成员变量来回滚所有内容。
我们针对内存中的 hsqldb 运行所有单元测试。
public class TestLogEntryDAO {
private EntityManager em;
private LogEntryDAO dao;
@Before
public void before() {
em = Persistence.createEntityManagerFactory("junit")
.createEntityManager();
dao = new DAOFactory<LogEntryDAO>(LogEntryDAO.class).newInstance(em,
Mockito.mock(ILogger.class));
em.getTransaction().begin();
RecordDAO recordDAO = new DAOFactory<RecordDAO>(RecordDAO.class)
.newInstance(em, Mockito.mock(ILogger.class));
recordDAO.setLogEntryDAO(dao);
createTestData(); // Is this ok?
}
@After
public void after() {
em.getTransaction().rollback();
em = null;
dao = null;
}
@Test
public void testSomething() {
// ...
}
}
提前致谢!
【问题讨论】:
-
尝试将每个
EntityManager存储在ThreadLocal中,这样您就可以确保在不希望它们被覆盖时不会覆盖实体管理器实例。
标签: java jpa junit jpa-2.0 parallel-processing