我在JUnit测试类中运行我的DAO测试,该测试类附带了正确的@ContextConfiguration和@RunWith注释。个别测试将一些数据放入数据库并检查健全性。在此之后,他们应该清理数据库状态。有一种简单的方法 - 将方法/类标记为@Transactional,然后在事务中执行方法并按原样执行回滚。
问题是这种DAO测试方法并不能完全模拟环境。说,我的JPA实体中有一些延迟加载的收集字段。在我的控制器代码中,我使用myDao.getMyEntity(id)调用获取此实体并迭代延迟集合。我在应用程序运行时获得的是一个LazyInitializationException,但这不会在我的测试中发生,因为它实际上是事务性的。如何在测试不是@Transactional的情况下运行我的测试,但数据仍然在测试结束时被清除?
如果它有任何区别,我会使用内存中的HSQLDB进行测试。
答案 0 :(得分:3)
你不应该在测试方法上使用@Transactional,我假设你的服务层方法和/或DAO方法都有。在测试方法上使用@Rollback,以便在运行测试后清除数据库。
答案 1 :(得分:1)
我会先阅读此内容,http://static.springsource.org/spring/docs/3.0.x/reference/testing.html#testcontext-tx
在我测试实际数据访问的情况下,我通常使用DBUnit在测试之前加载数据,然后进行清理。在这些测试中,我不使用@Transactional注释,因为我想看看我的测试类实际上是如何与数据库交互的,而不是它们在测试环境中如何工作。