我认为数据库测试通常包括CRUD操作。因此,这些函数会修改数据库,从而使预期的值发生变化:例如。如果我测试SELECT返回2行,如果删除测试运行1st,我可能会失败。与INSERT类似。 JUnit似乎不会在定义时运行测试,从而使预期值变得困难。
如果我在每次测试时重新初始化我的数据库,那么它可能会过度而且速度过慢。那么我怎么能解决这个问题呢?
答案 0 :(得分:3)
是的,正如Steve Hall所指出的那样,使用事务测试可以解决测试和测试运行之间100%的数据库一致性问题。 Spring为这类测试提供了非常精细的支持(参见transaction management in TestContext Framework),但没有它就没那么难实现。
在最终回滚事务的内部事务测试中,只要它们是测试启动的事务的一部分,您就可以自由地对数据应用任何CRUD操作。然后在测试拆除期间进行单次回滚,消除了对数据库的所有CRUD影响。
答案 1 :(得分:1)
您可能希望查看DBUnit之类的内容。如果这不符合您的需求,那么您可以尝试将测试包装在数据库事务中。您可以使用setup
和teardown
方法来启动和回滚您的交易。
答案 2 :(得分:0)
您的单元测试不应该依赖于顺序,但对于单元级测试,您通常不应该使用真正的数据库。您应该使用类似DBUnit的东西来模拟数据库,或者如果您的数据库隐藏在服务层接口后面,请为此创建一个模拟。