1

我正在尝试使用 Spring 和 DBunit ( http://springtestdbunit.github.io/ )测试我的代码

一旦进入单元测试:

sessionFactory.getCurrentSession().createCriteria(MyEntity.class).list()

将返回由 DBUnit 插入的实体列表,因此它确实在数据库 (MYSQL) 中插入了记录。

但:

sessionFactory.openStatelessSession().createCriteria(MyEntity.class).scroll(FORWARD_ONLY).next()

将返回错误!它无法使用无状态会话找到任何记录。

之前,我使用 Liquibase 插入相同的记录,这段代码运行良好。

使用 HSql 更糟糕的是,它在尝试打开无状态会话时完全冻结......(在 scroll() 指令上......)

谢谢您的帮助!

4

3 回答 3

0

所以!最终似乎是一个简单的交易问题

sessionFactory.getCurrentSession().getTransaction().commit();

让测试变绿!

现在的问题是如何让 DBUnit 提交我想的事务......

在测试开始时,在 DBUnit 初始化之后,我运行:

sessionFactory.getCurrentSession().getTransaction().wasCommitted()

它返回错误。这认为问题来自那里。

于 2015-04-16T09:52:49.317 回答
0

好的!所以这实际上与DBunit无关,有点......

此代码简单显示了相同的问题,并且没有 DBUnit 涉及:

MyEntity myEntity = new MyEntity ();
    sessionFactory.getCurrentSession().save(myEntity );
    assertEquals(1, sessionFactory.getCurrentSession().createCriteria(MyEntity .class).list()
            .size());
    assertTrue(sessionFactory.openStatelessSession().createCriteria(MyEntity .class)
            .scroll(ScrollMode.FORWARD_ONLY).next());

第一个断言是好的,第二个失败。所以我猜这是一个简单的休眠问题,而且我还猜想 liquibase 正在做某事以某种方式阻止它……可能是事务问题?

于 2015-04-16T09:44:11.090 回答
0

问题解决了!多亏了这个: https ://tadaya.wordpress.com/2008/04/27/transaction-aware-datasource-use-dbunit-hibernate-in-spring/

于 2015-04-16T11:41:40.563 回答