我正在测试一个非常简单的Java应用程序使用JUnit 4.通过“简单”我的意思是没有春天,没有休眠。我需要测试数据访问层(JDBC
,MySQL
),我怀疑哪种方法更适合这种测试?在@Before
上插入数据并在@After
上删除或在@Before
上创建交易并在@After
上回滚?JUnit:测试DAO - 回滚或删除
谢谢!
我正在测试一个非常简单的Java应用程序使用JUnit 4.通过“简单”我的意思是没有春天,没有休眠。我需要测试数据访问层(JDBC
,MySQL
),我怀疑哪种方法更适合这种测试?在@Before
上插入数据并在@After
上删除或在@Before
上创建交易并在@After
上回滚?JUnit:测试DAO - 回滚或删除
谢谢!
我不同意使用MySQL以外的数据库,因为您可能会暴露于测试中的平台差异,这些差异掩盖了您的代码与MySQL有关的问题。如果不进行大量的重构,某些代码/ SQL可能无法在另一个平台上工作。
但是,与其他人一致同意使用事务而不是删除或更新来恢复状态。一个告诫:如果你使用特效,函数等,那些可以在内部执行COMMIT,这可能会消除任何回滚JUnit更改的尝试。也许对你来说不是一个问题,但也许是别人需要记住的问题,特别是在处理那些从未考虑过单元测试的遗留数据库代码时。
交易的原因有两个:
我还会在内存数据库或MySQL中的临时表中使用volatile,这些表中的连接是特定的,并在连接关闭时自动删除。 我不会使用交易进行这种测试,因为您可能想要实际测试交易本身。
无论我在哪里工作,不同的开发人员喜欢不同的解决方案,这个问题都会一次又一次地出现。
首先,我真的不喜欢使用内存数据库,原因如下
我更喜欢事务回滚的删除,因为它们在事务开始之前将数据库保留在确切的状态,但如果您有成千上万的数据库,它会显着减慢测试速度。
我的确有时会质疑数据库测试的价值,并且赞成在新的数据库上运行集成测试的持续集成。这样我们覆盖了所有的数据访问。 在单元测试中,我们只是用Mockito或类似的模拟工具来模拟数据访问层。
事务回滚更安全,因为测试数据库保持不变,即使测试在测试方法和@After
之前停止。
然而,提交和删除测试中表现更好,因为一些约束期间提交(递延外键等)对新的数据来检查,所以用回滚有一些事情你不会测试。
所以这是你的,但在大多数情况下,事务回滚是preferrable的choise(我喜欢它太)。
尝试使用一些内存数据库像HSQL DB? – Reddy
@Reddy我想你应该写作为一个单独的答案,因为我认为这是最有效的一个。 – bezmax
如@布赖恩在他回答说,我想肯定的是,SQL querys是正确的,他们在MySQL的X平台上工作。而且,在这种情况下,访问MySQL服务器不成问题。 – Morvader