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エンコーディングを使用する方法に変更しなさい。