我正在尝试为我们的 Spring Boot 应用程序编写集成测试。我们想使用 spring-test-dbunit 和 dbunit 在具有空模式的 Postgresql 9.4.2 数据库上设置和拆卸测试数据。
在努力解决不区分大小写的表名之后,我可以通过将 DBUnit 配置属性caseSensitiveTableNames设置为 true 来轻松解决,我现在在列名方面遇到了完全相同的问题,但我无法弄清楚如何让 DBUnit 理解 Postgresql 没有与大写顺利。
这是我的(简化的)数据集:
<?xml version='1.0' encoding='UTF-8'?>
<dataset>
<customer_status status_id="0" descripton="description" />
</dataset>
到目前为止,这是我的基本测试用例:
@TestExecutionListeners({DependencyInjectionTestExecutionListener.class, DirtiesContextTestExecutionListener.class, TransactionalTestExecutionListener.class, DbUnitTestExecutionListener.class })
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = IntegrationTestConfig.class)
@WebAppConfiguration
@IntegrationTest("server.port:0")
@DbUnitConfiguration(databaseConnection="dbUnitDatabaseConnection")
@DatabaseSetup("classpath:datasets/authentication/oauth_setup.xml")
@DatabaseTearDown(type = DatabaseOperation.DELETE_ALL, value = { "classpath:datasets/authentication/oauth_setup.xml" })
@DirtiesContext
public class OauthIntegrationTest {
@Value("${local.server.port}")
int port;
@Test
public void thatStuffIsHappening() {
//here be stuff (test fails on dbunit setup)
}
}
最后这是我到目前为止的 DBUnit 配置:
@Import({ ControllerConfig.class, PersistenceConfig.class })
public class IntegrationTestConfig extends App {
@Autowired
DataSource dataSource;
@Bean
public DatabaseConfigBean dbUnitDatabaseConfig() {
final DatabaseConfigBean dbConfig = new DatabaseConfigBean();
dbConfig.setDatatypeFactory(new PostgresqlDataTypeFactory());
dbConfig.setCaseSensitiveTableNames(true);
return dbConfig;
}
@Bean
public DatabaseDataSourceConnectionFactoryBean dbUnitDatabaseConnection() {
final DatabaseDataSourceConnectionFactoryBean connection = new DatabaseDataSourceConnectionFactoryBean();
connection.setDataSource(this.dataSource);
connection.setDatabaseConfig(this.dbUnitDatabaseConfig());
connection.setSchema("public");
return connection;
}
}
运行测试最终会出现此错误:
org.dbunit.dataset.NoSuchColumnException: customer_status.DESCRIPTON - ColumnNameToIndexes 缓存映射中的(非大写输入列:descripton)。请注意,地图的列名不区分大小写。
这是正确的,因为 PSQL 中的所有列名都是小写的。为什么 DBUnit 将它们变成大写,有没有办法防止这种情况发生?
我试过用谷歌搜索它,但到目前为止唯一符合我的问题的是这个,但我真的不喜欢恢复到旧版本。
有什么提示吗?我不敢相信这是一个严重的问题,而不仅仅是我忽略了一些东西......