JUnit和Spring

时间:2016-11-20 07:02:40

标签: java spring testing junit dao

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

所以,这是一种直截了当的方式发生在我身上:

  1. 创建Spring test-context.xml并将测试所有DAO类所需的所有数据放在那里;
  2. 为每个测试类创建一个模板方法来测试CRUD操作,并且所有选择'操作;
  3. 在测试之前,将test-context.xml中所有需要的数据插入到真实数据库中。我们可能还需要一些依赖项(引用),所以也要插入它们,让我们在@Before方法中说。
  4. 在所有CRUD操作之后,删除DB中的所有依赖项(引用),让我们在@After方法中说。
  5. 如果我们有很多依赖关系,这可能会成为一种非常昂贵和费力的方法。此外,我们只有一个@Test方法(模板方法,以确保操作顺序:创建,读取......等) - 每个测试类一个测试。

    那么,我需要建议这种策略是否可行?你做了多少类似的测试你的DAO?

1 个答案:

答案 0 :(得分: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之类的其他软件层,并且可以编写隔离且可维护的单元测试。 不可避免的弊端是,当对数据库进行或多或少的重大更改时,我们需要重写整个测试,甚至重写几个测试。