JUnit数据库测试和测试排序

JUnit数据库测试和测试排序,junit,database-testing,Junit,Database Testing,我认为数据库测试包含CRUD操作是很常见的。因此,这些函数修改数据库,使预期的值发生变化:例如,如果我测试SELECT返回2行,如果delete测试首先运行,我可能会失败。类似于插入。JUnit似乎没有按照定义运行测试,这使得期望值很难实现 如果我在每次测试时都重新初始化数据库,那么它可能会过快和过慢。那么我该如何处理这个问题呢 单元测试不应该依赖于顺序,但是对于单元级测试,通常不应该使用真实的数据库。您应该使用类似DBUnit的东西来模拟数据库,或者如果您的数据库隐藏在服务层接口后面,则为其创

我认为数据库测试包含CRUD操作是很常见的。因此,这些函数修改数据库,使预期的值发生变化:例如,如果我测试SELECT返回2行,如果delete测试首先运行,我可能会失败。类似于插入。JUnit似乎没有按照定义运行测试,这使得期望值很难实现


如果我在每次测试时都重新初始化数据库,那么它可能会过快和过慢。那么我该如何处理这个问题呢

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

您可能希望看到类似的东西。如果这不符合您的需要,那么您可以尝试在数据库事务中包装您的测试。您可以使用
setup
teardown
方法启动和回滚事务。

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


在最终回滚其事务的事务测试中,您可以自由地对数据应用任何CRUD操作,只要它们是测试启动的事务的一部分。然后,在测试分解过程中进行一次回滚可以消除对数据库的所有CRUD影响。

我同意@Jeff的观点,即除非您测试与数据库的集成,否则您应该使用类似Mockito的东西模拟数据访问对象。