如何在组件初始化之前在Spring Boot测试中加载h2数据

Ash*_*hra 2 java tdd spring integration-testing spring-boot

我有一个带有 @Scheduled 方法的 @Component,该方法每 x 分钟运行一次(固定延迟)在运行我的集成 @SpringBootTest 时,该组件使用应用程序上下文进行初始化,然后执行我的测试方法

调度程序定期轮询数据库并执行一些逻辑。因此,一旦加载应用程序上下文,就需要在 h2 数据库中预加载数据

@Component
public class MyScheduler {
   ...
   ...
    @Scheduled(fixedDelayString = "${poll.interval:300}")
    public void testXYZ() throws Exception {
        dbService.fetchRecords();
        //do blah blah
    }
}
Run Code Online (Sandbox Code Playgroud)

在加载 @SpringBootTest 应用程序上下文之前,如何在 h2 中预加载初始数据?

一旦服务出现在我的集成测试中,我想基于一些 @Scheduled 定期运行来执行数据断言

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
public class MyIntegrationTest{

    ...

    @Test
    @Sql(scripts={"classpath:data/data.sql"}, 
    config=@SqlConfig(transactionMode = TransactionMode.ISOLATED), 
    executionPhase = ExecutionPhase.BEFORE_TEST_METHOD)
    testMySchedulerLogic() {
        assertTrue(isProcessed(), true);
    }
}
Run Code Online (Sandbox Code Playgroud)

小智 6

使用您需要的数据在测试资源中创建 import.sql 文件。

此外,如果 Hibernate 从头开始​​创建模式(即,如果 ddl-auto 属性设置为 create 或 create-drop),则在启动时执行类路径根目录中名为 import.sql 的文件。如果您小心的话,这对于演示和测试很有用,但可能不是您希望在生产中的类路径中出现的东西。这是一个 Hibernate 功能(与 Spring 无关)。

来源:https ://docs.spring.io/spring-boot/docs/current/reference/html/howto-database-initialization.html