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 中被多次调用的主要内容,如果未能解决你的问题,请参考以下文章