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