【发布时间】:2017-12-30 17:32:03
【问题描述】:
有人要求我为基于休眠的数据访问对象编写一些编码测试。
我想我会从一个简单的测试开始:当我保存一个模型时,它应该在dao.getTheList() 返回的集合中。问题是,无论如何,当我调用dao.getTheList() 时,它总是一个空集合。
应用程序代码已经在生产中运行,所以我们假设问题出在我的测试代码上。
@Test
@Transactional("myTransactionManager")
public void trivialTest() throws Exception {
...
// create the model to insert
...
session.save(model);
session.flush();
final Collection<Model> actual = dao.getTheList();
assertEquals(1, actual.size());
}
测试输出为expected:<1> but was:<0>
到目前为止,我在插入后尝试了explicitly committing,并尝试了disabling the cache,但都没有成功。
我不想成为 Hibernate 的大师,而且我没有足够的时间阅读整个文档。在不知道从哪里开始的情况下,这似乎对社区来说是一个很好的问题。
在测试的验证步骤执行之前,我可以做些什么来确保我的 Hibernate 插入已刷新/提交/取消缓存/或其他任何内容?
[编辑] 关于我尝试过的一些附加信息。我尝试在插入和调用dao.getTheList() 之间手动提交事务,但我只收到错误Could not roll back Hibernate transaction; nested exception is org.hibernate.TransactionException: Transaction not successfully started
@Test
@Transactional("myTransactionManager")
public void trivialTest() throws Exception {
...
// create the model to insert
...
final Transaction firstTransaction = session.beginTransaction();
session.save(model);
session.flush();
firstTransaction.commit();
final Transaction secondTransaction = session.beginTransaction();
final Collection<SystemConfiguration> actual = dao.getTheList();
secondTransaction.commit();
assertEquals(1, actual.size());
}
我还尝试过将@Transactional 注释从测试线程中移除并注释2 个帮助方法中的每一个,一个用于每个Hibernate 作业。为此,虽然我得到了错误:No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here.
[/编辑]
【问题讨论】:
-
dao.getTheList() 中有什么内容;
-
这是一个空集合