2015年4月25日土曜日

JUnit3を利用するDBUnitで、ExcelのXLSX形式に対応する。

諸般の事情で、JUnit4系にできないので、
主なライブラリ構成は以下の通りになりました。
  • JUnit3.8.2
  • DBUnit2.4.9
  • POI3.7

下記に記載がある通り、対応します。
JUnit - ふなWiki - xlsx をデータとして利用する

DBUnitでXLSXを扱うように変更する場合、POIの公式に記載してある通りに対応すればOKです。
Apache POI - Upgrading to POI 3.5, including converting existing HSSF Usermodel code to SS Usermodel (for XSSF and HSSF)

自前で対応した後、DBUnitが正式に対応したので、以下をパッチすれば良いと思います。
試してはいないですが、パッと見た感じだと私が対応した内容と同じ感じでした。
dbUnit / Git / Commit [c6a6ba] Apache POI liblary version up from "3.2-FINAL" to "3.11".


ついでに、読み込んだExcelの日時がズレてしまう問題に対応します。

以下のブログに言及がありますが、独自でXLSX対応しちゃうついでに、こちらもコードを直しちゃいます。
山下寛人オフィシャルブログ - DBUnit Excelロード時の時刻データ

対応する箇所は、以下の通りです。
org.dbunit.dataset.excel.XlsTable

    protected Object getDateValue(Cell cell) 
    {
        logger.debug("getDateValue(cell={}) - start", cell);
        
        double numericValue = cell.getNumericCellValue();
        Date date = DateUtil.getJavaDate(numericValue);
        // Add the timezone offset again because it was subtracted automatically by Apache-POI (we need UTC)
        long tzOffset = TimeZone.getDefault().getOffset(date.getTime());// この行をコメントアウトする。
        date = new Date(date.getTime() + tzOffset);                     // この行をコメントアウトする。
        return new Long(date.getTime());
        
        //TODO use a calendar for XLS Date objects when it is supported better by POI
//        HSSFCellStyle style = cell.getCellStyle();
//        HSSFDataFormatter formatter = new HSSFDataFormatter();
//        Format f = formatter.createFormat(cell);
//      String formatted = fomatter.formatCellValue(cell);
//System.out.println("###"+formatted);
//        Date dateValue = cell.getDateCellValue();
    }

とりあえず、これで問題なくテストできています。

0 件のコメント:

コメントを投稿