H2 DB Initial Set Up 脚本在 JUNIT 中被多次调用

Posted

技术标签:

【中文标题】H2 DB Initial Set Up 脚本在 JUNIT 中被多次调用【英文标题】:H2 DB Initial Set Up scripts are getting called multiple times in JUNIT 【发布时间】:2020-08-05 19:20:53 【问题描述】:

我正在尝试使用 H2 DB 为我的微服务编写 JUNIT 测试用例。我有一些用于数据库初始设置的 .sql 文件,例如创建架构、表等。这里看到的一个问题是 .sql 文件被多次调用,每个 JUNIT 测试文件一次。有没有办法处理这种情况?我的数据库设置文件如下所示 -

@Configuration
@ComponentScan(basePackages="com.sample.repository")

public class SampleDBConfig 

JdbcTemplate jdbcTemplate = null;
DataSource dataSource = null;

@Bean
public JdbcTemplate jdbcTemplate()

    if(jdbcTemplate == null)
        LOGGER.info("JdbcTemplate is null, so calling to create ");
        jdbcTemplate = new JdbcTemplate(getDataSource());
    else
        LOGGER.info("JdbcTemplate is already set");
    
    return jdbcTemplate;


@Bean
public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() 
   return new PropertySourcesPlaceholderConfigurer();


@Bean
DataSource getDataSource() 
    EmbeddedDatabaseBuilder builder = new EmbeddedDatabaseBuilder();
    if(dataSource == null)
        dataSource = builder
                .setType(EmbeddedDatabaseType.H2)
                .addScript("classpath:folder/initial-setup.sql")
                .build();
    
    return dataSource;



我的一个 JUNIT 测试类看起来像这样 -

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = SampleDBConfig.class)
public class XyxImplTest

@Autowired
ClassInTestImpl classInTestImpl ;

@Test
public void testMethod()
.......


其中一个正在测试的类是这样的 -

@Component
@Transactional(rollbackFor = Exception.class)
public class ClassInTestImpl implements ClassInTest 

@Autowired
private JdbcTemplate jdbcTemplate;
.....

【问题讨论】:

【参考方案1】:

我知道这是一个有点旧的线程,但是如果其他人有类似的问题,请添加一些注释。我遇到了同样的问题,当 H2 尝试为每个测试文件插入数据时,我遇到了唯一违反约束的错误。

最后是最新的 H2 版本导致了这种情况。如果您将 H2 版本从 1.4.200 更改为 1.4.199,它就像一个魅力。无需其他更改即可使其按预期工作。

【讨论】:

【参考方案2】:

我遇到了同样的问题。我所做的快速修复是,我配置了数据源 bean。在创建数据源的属性文件中添加了相关的弹簧属性。

我还在第一次测试中使用了@Sql("classpath:data1.sql"),因此该脚本只为该测试套件运行了一次。它对我有用。

【讨论】:

以上是关于H2 DB Initial Set Up 脚本在 JUNIT 中被多次调用的主要内容,如果未能解决你的问题,请参考以下文章

Spring boot - h2 DB 测试多次执行脚本

未加载 Spring Boot 测试 H2 sql 脚本

Spring H2 Test DB 在每次测试之前不会重置

如果满足条件,则退出 H2 sql 脚本

创建数据库时的 H2 文件嵌入模式运行脚本(未初始化连接)

将 h2 数据库从 h2.db 转换为 mv.db