可以为每个 SpringbootTest 注释加载特定的 data.sql

Posted

技术标签:

【中文标题】可以为每个 SpringbootTest 注释加载特定的 data.sql【英文标题】:Its possible to load specific data.sql for each SpringbootTest annotation 【发布时间】:2019-06-19 08:04:40 【问题描述】:

我有几个@SpringBootTest 测试,带有一个带有测试数据的data.sql 的enbebbed 数据库(h2)。每个测试都有自己的域,并且随着data.sql 越来越大。我想知道是否有任何选项可以为每个 @SpringBootTest 注释包含特定的 data.sql,例如 de properties source。

我知道有一个选项,即创建不同的application.properties 并在那里指定要加载的data.sql,但我想知道是否有更简洁的选项。

目前我有这个:

@SpringBootTest(classes = MyApplication.class, webEnvironment = 
SpringBootTest.WebEnvironment.RANDOM_PORT)
@ExtendWith(SpringExtension.class)
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
public class MyFunctionalTest 

我想要这样的东西:

@SpringBootTest(classes = MyApplication.class, webEnvironment = 
SpringBootTest.WebEnvironment.RANDOM_PORT)
@ExtendWith(SpringExtension.class)
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
@H2Data("sepecific.sql)
public class MyFunctionalTest 

【问题讨论】:

这就是@Sql 注释的用途。 我无法让它与 Junit5 一起工作,我看到的所有示例都是与 Junit4 一起工作的。你能举个例子说明@SpringBootTest是如何加载的吗?并使用@ExtendWith(SpringExtension.class) 不管你用什么。只需添加@Sql 指向您要使用的脚本... 【参考方案1】:

嗨,在我看来,我可能已经为常规的 spring boot 应用程序做过它,我没有尝试过测试,但我几乎可以肯定它可以用于测试。您需要像我在这篇文章中所做的那样声明多个DataSourceInitializers

@Bean
        public DataSourceInitializer dataSourceInitializer1(@Qualifier("datasource1") DataSource datasource) 
            ResourceDatabasePopulator resourceDatabasePopulator = new ResourceDatabasePopulator();
            resourceDatabasePopulator.addScript(new ClassPathResource("schema-h22.sql"));
            resourceDatabasePopulator.addScript(new ClassPathResource("data-h22.sql"));

                DataSourceInitializer dataSourceInitializer = new DataSourceInitializer();
                dataSourceInitializer.setDataSource(datasource);
                dataSourceInitializer.setDatabasePopulator(resourceDatabasePopulator);
                return dataSourceInitializer;
        

    @Bean
    public DataSourceInitializer dataSourceInitializer2(@Qualifier("datasource2") DataSource datasource) 
        ResourceDatabasePopulator resourceDatabasePopulator = new ResourceDatabasePopulator();
        resourceDatabasePopulator.addScript(new ClassPathResource("schema-h21.sql"));
        resourceDatabasePopulator.addScript(new ClassPathResource("data-h21.sql"));

            DataSourceInitializer dataSourceInitializer = new DataSourceInitializer();
            dataSourceInitializer.setDataSource(datasource);
            dataSourceInitializer.setDatabasePopulator(resourceDatabasePopulator);
            return dataSourceInitializer;
    

Spring Boot 2 Multiple Datasources initialize schema

【讨论】:

以上是关于可以为每个 SpringbootTest 注释加载特定的 data.sql的主要内容,如果未能解决你的问题,请参考以下文章

SpringBootTest 和Testng组成测试套件

SpringJUnit4ClassRunner 测试的配置与 SpringBootTest 冲突

在没有 @SpringBootTest 注释的 junit 测试期间抛出 NullPointerException,但没有注释

无法在标记为 @SpringBootTest 的组件测试中加载 @Configuration 类

@SpringBootTest - 无法加载应用程序上下文

SpringBootTest - 如何在测试级别断言上下文不加载和更改属性?