如何在AbstractTransactionalJUnit4SpringContextTests测试中测试我的DAO更新方法?

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)

这是因为事务尚未完成,所以数据库中没有任何更新吗?如何验证正确的记录已更新?

DCO*_*DCO 4

尝试使用@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 并在中途提交