2012-04-06 53 views
4

我认为它通常用于包含CRUD操作的数据库测试。所以这些函数修改数据库,使预期的值发生变化:例如。如果我测试一个SELECT返回2行,如果删除测试运行1st,我可能会失败。与INSERT类似。 JUnit看起来并没有像定义的那样运行测试,所以预期的值很难。JUnit数据库测试和测试排序

如果我在每次测试中都重新初始化我的数据库,它可能会过度并且很慢。那么我该如何解决这个问题呢?

回答

3

是的,正如Steve Hall指出的那样,使用事务测试解决了测试和测试运行之间数据库一致性问题的100%。 Spring为这种类型的测试提供了非常精心的支持(请参阅transaction management in TestContext Framework),但如果没有它,实现起来并不难。

在最终回滚事务的交易测试中,只要它们是测试启动的事务的一部分,您就可以自由地将任何CRUD操作应用于您的数据。然后在测试拆除过程中单次回滚消除了数据库上的所有CRUD影响。

0

你的单元测试不应该是顺序依赖的,但对于单元级别的测试,你通常不应该使用真正的数据库。你应该使用类似DBUnit的模拟数据库,或者如果你的数据库隐藏在服务层接口后面,为此创建一个模拟。

+0

我同意@Jeff,除非您测试与数据库的集成,否则您应该使用类似Mockito的模拟您的数据访问对象。 – MarkOfHall 2012-04-06 03:25:19

1

你可能想看看像DBUnit。如果这不符合您的需求,那么您可以尝试在数据库事务中包装测试。您可以使用setupteardown方法来启动和回滚事务。