@Sql不起作用@BeforeTransaction春季测试注释

时间:2018-07-21 05:46:23

标签: java sql spring junit spring-test

@ p @ BeforeTransaction(beforeTransaction方法)必须在@Commit之后在start.sql中运行SQL命令,以免数据库回滚。 Spring Testing Annotation

//run before test
@Commit
@Transactional
@BeforeTransaction
@Sql({"/start.sql"})//DONT WORK...
public void beforeTransaction()
{
  System.out.println("BEFORE START TRANSACTION");
}


@Test
@Commit
@Transactional
@Sql({"/delete.sql"})
public void sqlTest() {
    System.out.println("TEST RUN");
}

start.sql

SET search_path users;
-- here create default values
DELETE FROM users;
INSERT INTO users (id,name) (1,'Joe');
INSERT INTO users (id,name) (2,'Jack');
INSERT INTO users (id,name) (3,'Ellie');

delete.sql

SET search_path users;
--HERE DELETE ONE ROW
DELETE FROM users WHERE name = 'Joe';

运行测试后,我的数据库必须处于这种情况。

SET search_path = users;
SELECT * FORM users;
 --------------
|   2  | Jack  |
 ------ -------
|   3  | Ellie |
 ------ -------

但是那是空的(start.sql)不起作用

1 个答案:

答案 0 :(得分:1)

@Commit@Transactional@Sql仅在@BeforeTransaction@AfterTransaction方法(或任何其他测试生命周期方法,例如{{1 }},@Before等。

@After@Commit@Transactional仅在类级别和@Sql方法级别受支持。

如果要为给定的测试方法执行两个SQL脚本,则必须在同一测试方法上一起声明它们:

@Test

...或:

@Sql({"/start.sql", "/delete.sql"})

如果您希望对同一测试类中的每个测试方法执行相同的脚本,则可以像上面的示例一样对测试类进行注释

但是请注意,测试方法上@Sql("/start.sql") @Sql("/delete.sql") 的出现会覆盖类级别的所有@Sql声明。

如果您对具有类级方法级@Sql声明的可能性感兴趣,请参见this Spring issue