6. 便利な機能
6章では、5章までで紹介できなかったDBUnitの便利な機能について説明します。
6.1 バイナリデータ
画像を保存する以下のようなImageテーブルを操作するクラスについて考えてみましょう。
| カラム | データ型 | P | NN | 内容 |
|---|---|---|---|---|
| imageid | integer | * | ID(プライマリキー) | |
| image | bytea | 画像データ |
ImageBean
/**
* 画像データを表すクラス
*
* @author ono
*/
public class ImageBean {
/**
* ID
*/
private int imageid;
/**
* 画像データ
*/
private byte[] image;
/**
* @return image を戻します。
*/
public byte[] getImage() {
return image;
}
/**
* @param image image を設定。
*/
public void setImage(byte[] image) {
this.image = image;
}
/**
* @return imageid を戻します。
*/
public int getImageid() {
return imageid;
}
/**
* @param imageid imageid を設定。
*/
public void setImageid(int imageid) {
this.imageid = imageid;
}
}
ImageManager.java
import java.io.ByteArrayInputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
/**
* Imageを操作するManagerクラス。
*
* @author ono
*/
public class ImageManager {
/**
* 画像データをテーブルに保存する。
* @param image
* @throws Exception
*/
public void store(ImageBean image) throws Exception {
Connection connection = null;
try {
connection = getConnection();
String sql = "insert into image values(?,?)";
PreparedStatement stat = connection.prepareStatement(sql);
stat.setInt(1, image.getImageid());
byte[] data = image.getImage();
ByteArrayInputStream input = new ByteArrayInputStream(data);
stat.setBinaryStream(2, input, data.length);
stat.executeUpdate();
connection.commit();
} finally {
try {
if (connection != null) {
connection.close();
}
} catch (SQLException e) {}
}
}
/**
* データベースへの接続を取得する
* @return Connection
* @throws Exception
*/
private static Connection getConnection() throws Exception {
Class.forName("org.postgresql.Driver");
Connection connection = DriverManager.getConnection("jdbc:postgresql:Training.dbunit",
"postgres",
"");
return connection;
}
}
ImageManagerのstoreメソッドのテストを作成します。imageカラムのデータ型はバイナリデータです。よって、バイナリデータをテストデータとして扱う必要があります。FlatXmlDataSetなど、テストデータを文字列で管理している場合、バイナリデータはどのように表現すればよいのでしょうか?DBUnitでは、以下の3つの方法を提供しています。
- バイナリデータをファイルに保存し、DataSetにはファイルのURIを指定する
- バイナリデータをBase64エンコーディングした文字列を指定する
- ReplacementDataSetを使用する。
この章では、上の2つの方法について説明します。ReplacementDataSetに関しては、5章を参照してください。
ひとつ目は、データをファイルで管理する方法です。テストデータとして扱いたいバイナリデータがファイルとして保存されている場合、ファイルパスを指定すると、ファイルよりデータが読み込まれます。
image_data.xml
<dataset>
<image imageid="1" image="test.gif" />
</dataset>
image_data.xmlでは、テストデータを「test.gif」という名前のファイルで保存しています。image_data.xmlのimage属性の値にファイルのパスを記述すると、DbUnitがファイルよりバイナリデータを読み込みます。テストデータの保守性を考慮すると、この方法がバイナリデータの扱いとして最も適しているといえます。
2つ目の方法は、バイナリデータをbase64エンコーディングし、記述する方法です。バイナリデータをbase64エンコーディングするには、いろいろな方法があります。今回は、org.dbunit.util.Base64のencodebytesメソッドを使用します。
String encodedData=Base64.encodeBytes(data);
取得した文字列をimage_data.xmlのimage属性の値として記入すると、DbUnitが復号化し、バイナリデータを取得します。base64エンコーディングするには、他にも以下の方法があります。
- Linux 付属のuuencodeコマンドを使用する。
- javax.mail.internet.MimeUtility のencodeメソッドを使用する
実習課題1
ImageManagerのテストクラスを作成しなさい。
- FlatXmlDataSetを使用すること
- バイナリデータは別ファイルに保存すること
実習課題2
実習課題1で作成したテストプログラムをBase64エンコーディングを使用する方法に変更しなさい。

