我如何告诉@Sql
注解只为类运行一次,而不是为每个@Test
方法运行一次?
就像@BeforeClass
一样?
@org.springframework.test.context.jdbc.Sql(
scripts = "classpath:schema-test.sql",
executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD
)
public class TestClass {
@Test
public void test1() {
//runs the @Sql script
}
@Test
public void test2() {
//runs the @Sql script again
}
}
6条答案
按热度按时间hc8w905p1#
对于JUnit 5,直接的清洁*解决方案 *:
但是,如果数据库连接没有配置为
autoCommit = true
,则必须将所有连接都 Package 在一个事务中:为什么清洁*溶液 *?
因为根据使用@SqlConfig的脚本配置:
@Sql和@SqlConfig提供的配置选项与ScriptUtils和ResourceDatabasePopulator支持的配置选项等效,但它们是XML命名空间元素提供的配置选项的超集。
奖金
您可以将此方法与其他@Sql声明混合使用。
unftdfkk2#
你不可能开箱即用,
@Sql
annotation只有两种模式-BEFORE_TEST_METHOD
和AFTER_TEST_METHOD
。负责执行这些脚本的侦听器
SqlScriptsTestExecutionListener
不实现类前或类后方法。为了解决这个问题,我将实现自己的
TestExecutionListener
, Package 默认的SqlScriptsTestExecutionListener
,然后您可以在测试中声明使用新的侦听器而不是旧的侦听器。您的测试将变为:
uinbv5nw3#
@BeforeAll和@BeforeClass注解需要“static”方法。所以它不起作用。配置文件中的@PostConstruct怎么样?它对我来说很好用。
jtw3ybtb4#
由于
DefaultTestContext.java
中的getTestMethod()
方法,这段代码抛出了一个IllegalStateException
(Spring 5.0.1):当通过您建议的实现调用
beforeTestClass
方法时,textContext
不包含有效的testMethod
(这在此阶段是正常的):执行负责运行SQL脚本的代码(在
SqlScriptsTestExecutionListener
中)时,需要有效的testMethod
:我最终使用了以下解决方案:
h9a6wy2h5#
对于JUnit 5,我支持adrhc的解决方案。
对于Junit 4,您可以执行以下操作:
(同样,假设您的连接是
autoCommit=true
,请参见adrhc的帖子。)如果您打算并行运行测试,那么您需要使方法同步。
tjvv9vkg6#
如果不会导致不可接受的测试运行时间,另一种方法是对每种方法进行设置和拆卸。
另一种方法是将测试数据放入以下文件中,如https://www.baeldung.com/spring-boot-data-sql-and-schema-sql所述: