【发布时间】:2019-07-19 03:18:03
【问题描述】:
我正在使用 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;
我有以下 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
但是我的测试在最后一行失败了,
Assert.assertTrue("Failed to mark flag for deletion.", foundEvent.getFlaggedForDelete());
这是因为事务尚未完成,所以数据库中没有任何更新?我可以通过什么方式来验证是否更新了正确的记录?
【问题讨论】:
-
应该是同一个事务。您可以在 Hibernate 中设置 SQL 语句记录以检查实际正在执行的 SQL
-
我打开它并验证 SQL 语句已执行。事实上,“affectedRows = m_entityManager.createQuery ...”行表示受影响的多行,所以我认为这意味着事情已成功执行。
-
我并不是要在你的问题中抛出扳手,但我想问一下,你为什么要对数据库操作进行单元测试?我不确定您从对数据库操作进行单元测试中获得了什么价值。从您的断言来看,您似乎没有在测试任何业务需求。大多数时候,我们只是模拟所有需要实时运行系统进行单元测试的东西。坦率地说,如果您这样做只是为了满足您的代码覆盖率要求,那么您就是在浪费时间。你的时间会花在编写测试上,这会增加更多的价值。
-
方法
foundEvent.getFlaggedForDelete()的返回值是什么? -
能否发送
FailedEvent类以及flagForDeleteByObjectId和findByEventId方法?
标签: java spring hibernate junit transactions