理系学生日記

おまえはいつまで学生気分なのか

DBUnit から "Potential problem found: The configured data type factory 'class org.dbunit.dataset.datatype.DefaultDataTypeFactory' might cause problems with the current database" と怒られたあなたへ贈るメッセージ

あなたへ贈るメッセージ

このFAQを読めや!!!!!

背景

DBUnit を使ったテストをしていてふとログを見てみると、以下のような WARN ログが出力されることがあります。

[main] WARN org.dbunit.dataset.AbstractTableMetaData - Potential problem found: The configured data type factory 'class org.dbunit.dataset.datatype.DefaultDataTypeFactory' might cause problems with the current database 'MySQL' (e.g. some datatypes may not be supported properly). In rare cases you might see this message because the list of supported database products is incomplete (list=[derby]). If so please request a java-class update via the forums.If you are using your own IDataTypeFactory extending DefaultDataTypeFactory, ensure that you override getValidDbProducts() to specify the supported database products.

これ何かというと、「おまえの使っている DefaultDataTypeFactory だと DBMS 依存の型が解決できない可能性があるから、使ってる DBMS 特有の DataTypeFactory を使ったほうがいいんじゃない?」という警告。 当然ここでは DataTypeFactory って何?ということになるわけですが、DBUnit の世界の DataTypeFactory っていうのは、IDataTypeFactory interface を実装したクラスのことで、ではこの interface の役割はというと、java.sql で定義されている Types と DataSource から渡ってくる sqlTypeName から、DBUnit 上の型が何かを解決することになる。

ご存知の通り、DB にどのような型が用意されているかは DBMS 毎に大きく異っているので、それは DBMS 毎に定義された IDataTypeFactory でないと解決できない。なので、そういうのちゃんと使った方が良くない????と DBUnit が気を効かせてくれてるわけです。 例えば MySQL だとこんな感じで、"longtext" だったら CLOB として、bit だったら BOOLEAN として、"point" だったら BINARY として扱うようになってる。

まぁこのあたりはあんまり考えることなく、FAQ に記載のあるとおり、IDatabaseConnection から config 引っ張ってきて、プロパティに自分の使いたい DBMS の DataTypeFactory を差し込めば問題ないです。

IDatabaseConnection connection = new DatabaseConnection(jdbcConnection, schema);
DatabaseConfig config = connection.getConfig();
config.setProperty(DatabaseConfig.PROPERTY_DATATYPE_FACTORY, new OracleDataTypeFactory());