目次へ

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

↑このページの先頭へ

こちらもチェック!

PR
  • XMLDB.jp