Java JUnit:测试DAOs-回滚或删除

Java JUnit:测试DAOs-回滚或删除,java,database,unit-testing,junit,Java,Database,Unit Testing,Junit,我正在使用JUnit4测试一个非常简单的java应用程序。我说的“简单”是指没有春天也没有冬眠。我需要测试数据访问层(JDBC,MySQL),我怀疑哪种方法更适合这种测试?在之前的上插入数据,在之后的上删除数据,或者在之前的上创建事务,在之后的上回滚 谢谢 交易有两个原因: 写入/删除可能比回滚更昂贵 误差幅度较小(删除数据的代码可能有bug) 我也会选择易失性内存数据库或MySQL中的临时表,它们是特定于连接的,并且在连接关闭时自动删除。 我不会在这种测试中使用事务,因为您可能希望实际测试事

我正在使用JUnit4测试一个非常简单的java应用程序。我说的“简单”是指没有春天也没有冬眠。我需要测试数据访问层(
JDBC
MySQL
),我怀疑哪种方法更适合这种测试?在之前的上插入数据,在之后的上删除数据,或者在之前的上创建事务,在之后的上回滚


谢谢

交易有两个原因:

  • 写入/删除可能比回滚更昂贵
  • 误差幅度较小(删除数据的代码可能有bug)

我也会选择易失性内存数据库或MySQL中的临时表,它们是特定于连接的,并且在连接关闭时自动删除。
我不会在这种测试中使用事务,因为您可能希望实际测试事务本身。

我不同意使用MySQL以外的DB,因为您可能会在测试中暴露出平台差异,从而掩盖代码与MySQL之间的问题。如果不进行大规模重构,您的一些代码/SQL甚至可能无法在其他平台上工作

但是,请同意其他人使用事务而不是删除或更新来恢复状态


一个警告:如果您使用的是进程、函数等,那么这些可以在内部进行提交,这可能会破坏任何回滚JUnit更改的尝试。也许这不是你的问题,但可能是其他人要记住的问题,特别是在处理从未考虑过单元测试的遗留DB代码时。

无论我在哪里工作,不同的开发人员喜欢不同的解决方案,这都会一再出现

首先,我不太喜欢使用内存中的数据库,原因如下

  • 代码似乎超过了测试。我们发现在内存中测试的表在实际数据库中不存在的代码库
  • 这些数据库并不完全相同,如果您在内存中使用hsql,但您的主数据库是MySQL,那么在语法、日期等方面会有一些差异。我知道您可以使用ASCII Sql,但您正在测试的东西不是您将要运行的东西。将会有不同之处 我更喜欢事务回滚而不是删除,因为它们使数据库处于事务开始之前的确切状态,但如果有数千个事务回滚,则会显著降低测试速度

    我有时会质疑数据库测试的价值,并支持在新数据库上运行集成测试的continuos集成。这样我们就涵盖了所有的数据访问。
    在单元测试中,我们只需使用Mockito或类似的模拟工具模拟数据访问层。

    事务回滚更安全,因为测试数据库保持不变,即使测试在测试方法之前停止,在之后停止

    但是,commit和delete测试更好,因为在commit期间会根据新数据检查一些约束(延迟外键等),所以使用rollback时,有些东西是不会测试的


    因此,这取决于您,但在大多数情况下,事务回滚是首选选项(我也更喜欢)。

    尝试使用一些内存中的数据库,如HSQL db?@Reddy,我认为您应该将其作为一个单独的答案,正如@Brian在他的回答中所说的,我想确保sql查询是正确的,并且它们在MySQL X平台上工作。此外,在本例中,访问MySQL服务器不是问题。