繁体   English   中英

使用JUnit和Spring的DAO层测试策略

[英]DAO layer testing strategy with JUnit and Spring

我正在尝试设计一种最佳策略来对Spring应用程序的DAO层进行单元测试。 许多现有的方法,例如内存中数据库的使用等(帖子:12289800、12390813、9940010、12801926)。 不要吸引我。

因此,这是我想到的一种直接方法:

  1. 创建Spring test-context.xml并放置测试所有DAO类所需的所有数据;
  2. 为每个测试类创建一个模板方法来测试CRUD操作和所有“选择”操作;
  3. 在测试之前,将所有需要的数据从test-context.xml插入到您的真实数据库中。 我们可能还需要一些依赖项(引用),因此也要插入它们,例如在@Before方法中。
  4. 完成所有CRUD操作后,从@After方法中删除数据库中的所有依赖项(引用)。

如果我们有很多依赖关系,这可能会成为非常昂贵和费力的方法。 同样,我们只有一个@Test方法(模板方法,以确保操作的顺序:创建,读取...等)-因此每个测试类一个测试。

因此,我需要建议这个策略是否可行? 您做了什么类似的测试DAO?

毕竟,我最终采用了这种策略来测试负责与基于Spring的应用程序中的数据库进行交互的类。 主要思想:

  1. 使用内存数据库(H2正常),一个单独的带有测试数据源和设置的Spring配置文件。
  2. 数据库是在整个测试过程的开始时通过schema.sql脚本建立的。 因此,我们需要sql源来重建测试数据库。 如果您自己设计数据库,则它可能来自DBA或您自己。 如果您在大型团队中使用数据库,则像liquibase或flyway之类的工具将使每个人都需要通过应用增量脚本来获取数据库的实际状态。 这样,结果设置脚本将由该工具管理。
  3. 显然,每个测试用例在执行测试之前都需要初始化自己的数据集。 为此,我们使sample.sql / clear_sample.sql脚本(每个测试用例一对)在每个案例之前和之后插入和删除数据。 为此,我们可以使用spring的注释: @SqlScriptUtils
  4. 为了帮助设计测试,我们可以注入EntityManager例如在sql脚本的帮助下检索插入的内容。
  5. 基本的JUnit断言用于比较。

因此,我们没有其他软件层(如DbUnit或其他任何东西),并且可以编写隔离且可维护的单元测试。 不可避免的缺点是,当对数据库进行或多或少的重大更改时,我们需要重写整个测试,甚至重写几个测试。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM