当包含周期表名称时,DBUnit @DatabaseSetup 与 CSV 加载器不起作用

问题描述

当我在测试中使用 @DatabaseSetup 时。 标题案例中有一个错误“没有这样的表”。

它正在收集下面的案例。


CSV 加载器

public class CsvDataSetLoader extends AbstractDataSetLoader {
    @Override
    protected IDataSet createDataSet(Resource resource) throws Exception {
        return new CsvDataSet(resource.getFile());
    }
}

sql:

create table test
(
    id int
);

table-ordering.txt

test

测试.csv

id
1
2
3

测试类

@SpringBoottest(classes = {TestConfig.class})
@RunWith(springrunner.class)
@DbUnitConfiguration(dataSetLoader = CsvDataSetLoader.class) 
@TestExecutionListeners({
  DependencyInjectionTestExecutionListener.class,DbUnitTestExecutionListener.class
})
@Transactional
public class JsonDatabaseTest {

  @Autowired
  JdbcTemplate jdbcTemplate;

  @Test
  @DatabaseSetup("/table/init")
  public void test(){
    System.out.println(jdbcTemplate.queryForList("select * from test"));
    // printed out 1,2,3
  }
}


但它发生了错误'没有这样的表 sh.test'

sql:

create schema sh;

create table sh.test
(
    id int
);

table-ordering.txt

sh.test

sh.test.csv

id
1
2
3

测试类

@SpringBoottest(classes = {TestConfig.class})
@RunWith(springrunner.class)
@DbUnitConfiguration(dataSetLoader = CsvDataSetLoader.class) 
@TestExecutionListeners({
  DependencyInjectionTestExecutionListener.class,DbUnitTestExecutionListener.class
})
@Transactional
public class JsonDatabaseTest {

  @Autowired
  JdbcTemplate jdbcTemplate;

  @Test
  @DatabaseSetup("/table/init") // if comment out this,no error occurs
  public void test(){
    System.out.println(jdbcTemplate.queryForList("select * from sh.test"));
  }
}

当我注释掉代码时,没有错误发生,所以名为“sh.test”的表肯定存在。 但是为什么 @DatabaseSetup 缺少表格?我猜不出来.....

解决方法

很简单。

在设置类

  @Bean
  H2Connection h2Connection() throws DatabaseUnitException,SQLException{
    return new H2Connection(dataSource().getConnection(),"sh");
  }

在测试课

@DbUnitConfiguration(databaseConnection = "h2Connection",dataSetLoader = CsvDataSetLoader.class) 

现在我不需要将架构名称添加到文件名等中