带有Postgresql的DBUnit和列名称的区分大小写 - 它是如何工作的?

时间:2015-06-29 10:10:49

标签: postgresql spring-boot dbunit spring-test-dbunit

我正在尝试为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;
      }
  }

运行测试最终会出现此错误:

  ColumnNameToIndexes缓存映射中的

org.dbunit.dataset.NoSuchColumnException:customer_status.DESCRIPTON - (非大写输入列:descripton)。请注意,地图的列名称不区分大小写。

哪个是正确的,因为PSQL中的所有列名都是小写的。为什么DBUnit会将它们变为大写,有没有办法防止这种情况?

我试图谷歌它,但到目前为止唯一匹配我的问题是this,但我真的不喜欢恢复旧版本。

任何提示?我无法相信这是一个严重的问题,而不仅仅是我忽略了一些事情......

1 个答案:

答案 0 :(得分:1)

哦,我的 - 这只是一个重要的问题。我的setup.xml文件中有一个拼写错误。而不是&#34;描述&#34;我写了#34; descripton&#34;。

现在它有效,除了我的打字和阅读技巧之外没有任何问题。 ;)