Dav*_*ave 9 java junit spring hibernate transactions
我正在使用Java 8,JUnit 4.12,Spring 4和Hibernate 5.2.12.Final。我想测试一个Hibernate方法,在其中更新一些行。方法看起来像这样
final CriteriaBuilder qb = m_entityManager.getCriteriaBuilder();
final CriteriaUpdate<FailedEvent> q = qb.createCriteriaUpdate(FailedEvent.class);
final Root<FailedEvent> root = q.from(FailedEvent.class);
q.where(qb.and( qb.equal(root.get(FailedEvent_.objectId), objectId) ));
q.set(root.get(FailedEvent_.flaggedForDelete), true);
affectedRows = m_entityManager.createQuery(q).executeUpdate();
return affectedRows > 0;
Run Code Online (Sandbox Code Playgroud)
我有以下JUnit测试来验证这一点
public class FailedEventDaoTest extends AbstractTransactionalJUnit4SpringContextTests
...
@Test
public final void testFlagForDeleteByObjectId()
{
final String eventId = "testId";
final FailedEvent event = failedEventDao.findByEventId(eventId);
Assert.assertFalse("A pre-condition fo this test is that an failed_event record with id \"" + eventId + "\" have a non-empty object id.", StringUtils.isEmpty(event.getObjectId()));
Assert.assertTrue(failedEventDao.flagForDeleteByObjectId(event.getObjectId()));
final FailedEvent foundEvent = failedEventDao.findByEventId(eventId);
Assert.assertTrue("Failed to mark flag for deletion.", foundEvent.getFlaggedForDelete());
} // testFlagForDeleteByObjectId
Run Code Online (Sandbox Code Playgroud)
但是我的测试在最后一行失败了,
Assert.assertTrue("Failed to mark flag for deletion.", foundEvent.getFlaggedForDelete());
Run Code Online (Sandbox Code Playgroud)
这是因为事务尚未完成,所以数据库中没有任何更新吗?如何验证正确的记录已更新?
尝试使用@AfterTransaction注解来测试结果。
@AfterTransaction
public final void theRealTest()
{
Assert.assertTrue("Failed to mark flag for deletion.", foundEvent.getFlaggedForDelete());
}
Run Code Online (Sandbox Code Playgroud)
https://www.springbyexample.org/examples/simple-spring-transactional-junit4-test-code-example.html
如果这也不起作用尝试:
“因此,您需要在测试方法中创建多个事务。如您所见,您不能使用 AbstractTransactionalJUnit4SpringContextTests,因为它为整个测试方法创建单个事务,并且不能使用裸的 AbstractJUnit4SpringContextTests,因为它根本不创建任何事务。
解决方案是使用 AbstractJUnit4SpringContextTests 并以编程方式管理测试方法内的事务。
您需要将 PlatformTransactionManager 注入到您的测试中,从中创建 TransactionTemplate 并使用它来划分您的事务,如 11.6 编程事务管理中所述。”
在这里找到: 使用 AbstractTransactionalJUnit4SpringContextTests 并在中途提交
| 归档时间: |
|
| 查看次数: |
324 次 |
| 最近记录: |