@SQL每堂课一次

Mih*_*238 4 spring spring-mvc spring-test

我正在使用Spring框架编写一些集成测试。对于不同的集成测试类,我有不同的SQL脚本。像这样:

@ContextConfiguration(classes = ...)
@Sql("classpath:sportCenter-test.sql")
public class SportCenterResourceIT {
    ...
}
Run Code Online (Sandbox Code Playgroud)

除了在每次测试之前执行SQL脚本(而不是每个类一次)的事实之外,所有其他功能都可以正常运行。我已经搜索了一段时间的spring文档,但是找不到与该选项相关的东西。

有人可以给我一个提示吗?

小智 6

我用这种方式来解决问题:

@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD)
@Sql("classpath:sql/DataForRouteTesting.sql")
public class MyTest {}
Run Code Online (Sandbox Code Playgroud)

每次都执行脚本,但不存在主键冲突。


小智 5

org.springframework.transaction.annotation.Transactional在类级别添加注释将防止@Sql脚本之间的任何更改在测试之间持久存在。因此,您的代码变为:

@ContextConfiguration(classes = ...)
@Sql("classpath:sportCenter-test.sql")
@Transactional
public class SportCenterResourceIT {
    ...
}
Run Code Online (Sandbox Code Playgroud)

这种组合将导致以下结果:

  1. 您的@Sql脚本将在每次测试之前运行
  2. 测试本身将运行
  3. 在步骤1或步骤2中对数据库所做的任何更改都将在每次测试结束时恢复

  • 我的sql脚本正在插入数据。当第二个测试运行时,sql 被再次加载,这给了我一个主键约束异常。如何防止这种情况发生? (2认同)