在Spring、junit、mockito单元测试总结提到单元测试时hibernate事务自动回滚的配置方法,在部分方法使用hibernate调用原生sql或执行hql 的update 或 delete操作时,由于将之前插入测试数据的操作未提交事务,使得这些用例执行失败。
对于上面的问题,经本人测试可以在插入测试数据操作后调用hibernateTemplate的flush和clear方法,将之前操作数据提交后执行,由于配置了事务自动回滚,测试数据不会提交到数据库。
@Test
public void testRemoveBagPeriodRuleByIds() {
// 先插入新的记录
BagPeriodRule bagPeriodRule = getNewBagPeriodRule();
String dealerIds = "2,3,4";
int maxId = getMaxId();
String msg = bagPeriodRuleService.saveBagPeriodRules(bagPeriodRule,
dealerIds);
int maxId1 = getMaxId();
// 保存成功后最大记录Id应该增加
assertTrue(maxId1 > maxId);
List<BagPeriodRule> list = findByIdScope(maxId, maxId1);
assertNotNull(list);
// 数据库中有相同记录时提示信息不为空
if ("".equals(msg)) {
assertTrue(3 == list.size());
}
// 获取新插入记录的Id
StringBuilder periodIds = new StringBuilder();
for (BagPeriodRule bagPeriodRule2 : list) {
periodIds.append(bagPeriodRule2.getPeriodId()).append(",");
}
<span style="color:#FF0000;">bagPeriodRuleDao.flush();</span>
// 调用批量删除方法删除记录
if (periodIds.length() > 0) {
bagPeriodRuleService.removeBagPeriodRuleByIds(periodIds.substring(
0, periodIds.length() - 1));
}
<span style="color:#FF0000;">bagPeriodRuleDao.flush();
bagPeriodRuleDao.clear();</span>
List<BagPeriodRule> list1 = findByIdScope(maxId, maxId1);
for (BagPeriodRule bagPeriodRule2 : list1) {
assertTrue(1 == bagPeriodRule2.getIsDelete());
}
}