@SQL每班一次

时间:2015-03-19 19:13:06

标签: spring spring-mvc spring-test

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

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

除了SQL脚本在每个测试之前执行而不是每个类一次执行之外,一切都运行正常。我已经搜索了一些春季文档,但我找不到与此类选项相关的内容。

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

5 个答案:

答案 0 :(得分:3)

在类级别添加@Sql注释将阻止@ContextConfiguration(classes = ...) @Sql("classpath:sportCenter-test.sql") @Transactional public class SportCenterResourceIT { ... } 脚本的任何更改在测试之间保持不变。所以你的代码变成了:

@Sql

此组合将产生以下结果:

  1. 您的public partial class mainForm : Form { bool host = false; string HostName = ""; string HostName1 = "192.168.0.30"; string HostName2 = "192.168.0.31"; String SendCommand(String Command) { if (host == false) HostName = HostName1; else if (host == true) HostName = HostName2; //code that uses Hostname to toggle switch, which does work } private void btnProgramEther_Click_1(object sender, EventArgs e) { host = true; SendCommand("turn switch on"); } } 脚本将在每次测试之前运行
  2. 测试本身将运行
  3. 在每次测试结束时,将恢复步骤1或2中的任何数据库更改

答案 1 :(得分:3)

如果我们要每个类一次执行sql脚本,则可以在setup方法中执行该脚本,并且一旦为一种方法执行了脚本,就将flag设置为true,这样就不会再次执行。 ` @Autowired 私有DataSource数据库;

私有静态布尔dataLoaded = false;

@Before
public void setup() throws SQLException {
    if(!dataLoaded) {
        try (Connection con = database.getConnection()) {
            ScriptUtils.executeSqlScript(con, new ClassPathResource("path_to_script.sql"));
            dataLoaded = true;
        }
    }
}`

答案 2 :(得分:0)

我使用这种方法来解决问题:

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

脚本每次都执行,但是没有冲突的主键。

答案 3 :(得分:0)

我通过将sql脚本放在名称为 data.sql src / test / resources 文件夹中解决了我的问题。在每个集成测试启动时,将执行一次此文件。为此,您需要删除@Sql批注。

答案 4 :(得分:-1)

您可以创建一个用@BeforeAll 和@Sql("classpath:sportCenter-test.sql") 注释的空静态方法

@BeforeAll
@Sql("classpath:sportCenter-test.sql") 
public static void initSql() {
    
}