我想编写一个单元测试来验证是否正确设置了乐观锁定(使用Spring和Hibernate)。
我想让测试类扩展Spring的AbstractTransactionalJUnit4SpringContextTests
。
我要结束的是这样的方法:
@Test (expected = StaleObjectStateException.class)
public void testOptimisticLocking() {
A a = getCurrentSession().load(A.class, 1);
a.setVersion(a.getVersion()-1);
getCurrentSession().saveOrUpdate(a);
getCurrentSession().flush();
fail("Optimistic locking does not work");
}
该测试失败。您推荐什么是最佳做法?
我尝试这样做的原因是我想将
version
传输到客户端(使用DTO)。我想证明,当DTO发送回服务器并与新加载的实体合并时,如果该实体在此期间被其他人更新,则保存该实体将失败。 最佳答案
似乎根本不是将所有字段从DTO(包括版本)转移到新加载的实体,尝试保存它,并在实体在DTO上被修改时被修改的情况下得到例外的选择。客户端。
这样做的原因是,假设您在同一会话中工作,Hibernate根本不在乎您对版本字段所做的操作。会话会记住版本字段的值。
一个简单的证明:
@Test (expected = StaleObjectStateException.class)
public void testOptimisticLocking() {
A a = getCurrentSession().load(A.class, 1);
getCurrentSession().evict(a); //comment this out and the test fails
a.setVersion(a.getVersion()-1);
getCurrentSession().saveOrUpdate(a);
getCurrentSession().flush();
fail("Optimistic locking does not work");
}
无论如何,感谢大家的帮助!