たま

技術的なメモ置き場。主にJava。

Spring Test DBUnitでJSONカラムにデータを投入する

Spring Test DBUnit@DatabaseSetup を使用してテストデータを投入する際に、対象のテーブルにJSONカラムが存在すると失敗するが、PostgresqlDataTypeFactoryを拡張することで投入できるようになる。

環境

  • Spring Boot 1.4.1
    • Spring Boot Test Starter
  • Spring Test DBUnit 1.3.0
  • PostgreSQL 9.5

PostgresqlDataTypeFactoryの拡張

DBUnitのFeature RequestsにJSONカラムに対応するための以下の2つのクラスが置いてある。※ステータスがpendingであることに注意
https://sourceforge.net/p/dbunit/feature-requests/188/

  • JsonType.java
  • PostgresqlDataTypeFactory.java

JSONBに対応していないので、PostgresqlDataTypeFactory.javaの一部を修正する。

public DataType createDataType(int sqlType, String sqlTypeName) throws DataTypeException {
    // 省略
    if ("json".equals(sqlTypeName) || 
        "jsonb".equals(sqlTypeName) /* ←を追加*/ ) {
            return new JsonType()
    }
    // 省略
}

Configurationクラスの修正

上の2つのクラスを適当なパッケージに配置後、Configurationクラスの修正を行う。

@Configuration
public class TestConfig {
    @Bean
    public DataSource dataSource() {
        // 省略
    }

    @Bean
    public DatabaseConfigBean dbUnitDatabaseConfig() {
        DatabaseConfigBean dbConfig = new DatabaseConfigBean();
        dbConfig.setDatatypeFactory(new PostgresqlDataTypeFactory());
        return dbConfig;
    }

    @Bean
    public DatabaseDataSourceConnectionFactoryBean dbUnitDatabaseConnection() {
        DatabaseDataSourceConnectionFactoryBean dbConnection = new DatabaseDataSourceConnectionFactoryBean(dataSource());
        dbConnection.setDatabaseConfig(dbUnitDatabaseConfig());
        return dbConnection;
    }
}

これでJSONデータの投入が可能となる。