【问题标题】:DAO layer testing strategy with JUnit and SpringJUnit 和 Spring 的 DAO 层测试策略
【发布时间】:2016-11-20 07:02:40
【问题描述】:

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

所以,我想到了一个简单的方法:

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

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

那么,我需要一个建议,这个策略是否可行?你做了哪些类似的事情来测试你的 DAO?

【问题讨论】:

  • 你使用哪个 IDE 取决于它,如果你想使用 STS IDE 则将你的依赖项放在 pom.xml 中,它将维护并帮助你更新依赖项。您遵循的路径是必要的,因此您以正确的方式前进。在您将代码投入生产之前,测试是必要的。所以请通过 Junit 进行测试。
  • 依赖关系是指连接到数据库中给定表的数据库的其他实体))换句话说对其他表的引用。我们不能依赖现有的,所以需要插入它才能正确测试。

标签: java spring testing junit dao


【解决方案1】:

毕竟,我最终采用了这种策略来测试基于 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 或任何东西,并且编写独立且可维护的单元测试。 不可避免的缺点是,当数据库或多或少发生重大变化时,我们需要重写整个测试,甚至几个。

【讨论】:

    猜你喜欢
    • 2012-01-25
    • 1970-01-01
    • 2014-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多