※当サイトの記事には、広告・プロモーションが含まれます。

DBUnitでInvalid row number (65536) outside allowable range (0 65535)が出た

xtech.nikkei.com

⇧ う~む、紛らわしくならなければ良いけども...

DBUnitとは?

公式のドキュメントによりますと、

www.dbunit.org

DbUnit is a JUnit extension (also usable with Ant) targeted at database-driven projects that, among other things, puts your database into a known state between test runs. This is an excellent way to avoid the myriad of problems that can occur when one test case corrupts the database and causes subsequent tests to fail or exacerbate the damage.

https://www.dbunit.org/

JUnitの拡張で、テストでデータベースを使うことができますと。

JUnitはと言うと、

JUnit is a unit testing framework for the Java programming language. JUnit has been important in the development of test-driven development, and is one of a family of unit testing frameworks which is collectively known as xUnit that originated with SUnit.

https://en.wikipedia.org/wiki/JUnit

Java単体テスト用のライブラリですかね。

DBUnitExcelを使う場合はApache POI系のライブラリが必要

で、

qiita.com

⇧ 上記サイト様によりますと、DBUnitExcelを使う場合は、DBUnitの依存関係とは別に、Apache POI系のライブラリを導入する必要があるようです。

必要な依存関係としては、

poi.apache.org

⇧ 上記の表にまとまってはいる模様。

「.xlsx」に対応させるには、

  • poi
  • poi-ooxml

の2つがあれば良いってことですかね?

DBUnitに必要なApache POI系のライブラリのバージョンは不明というね...頑張ってエラーにならないバージョンを見つけるしかないんかね...

DBUnitでInvalid row number (65536) outside allowable range (0 65535)が出た

で、DBUnitでデータベースからテーブルのレコードを取得してきてExcelに書き込みしてたら、

Invalid row number (65536) outside allowable range (0 65535)    

⇧ というエラーが出ましたと。

どうやら、テーブルのレコード数が多過ぎて、Excel2003までの行数の限界である65535行以上は書き込めないということで出るエラーかと。

Apache POIは、

poi.apache.org

⇧ 上記のドキュメントによりますと、大きく分けて、

  • HSSF
    .xlsに対応
  • XSSF
    .xlsxに対応

対応できるExcelの拡張子が分かれていて、DBUnitを普通に使うと、「.xls」対応で処理されてしまうらしく、65535行の縛りが発生してしまうそうな...

で、

kazuhito-m.github.io

⇧ 上記サイト様が、DBUnitでも「.xlsx」の行数(おそらく、 1,048,576 行)までいけるように改善してくれたようです。

ただ、データ量が多過ぎると、書き込みの処理でOutOfMemoryErrorが出てしまったけどね...JVMの起動時のメモリを増量したとしても限界があるしな...

テスト環境では、データベースにレコードを入れ過ぎないようにするしか無いんかな...

ちなみに、Microsoftのサポートのページの説明を見た限り、

support.microsoft.com

Excelのバージョンが新しくても、

 1,048,576 行

が上限らしいので、レコード数が膨大なデータベースのテストとかってどうしてるんですかね?

未曾有の情報化社会と言っても過言ではない昨今、レコード数が100万超えることなんて珍しくもなくなってくる気がするけども、どうテストするか知りたいものですね。

と言うか、

Invalid row number (1048576) outside allowable range (0..1048575)

⇧ のエラーになったら、対応方法が無いっぽい気がするんだが...

ちなみに、

qiita.com

  • Excel でデータセットを定義できる
    • これは、本家DBUnitの XlsDataSet が使用されている
    • XlsDataSet の使い方については こちら を参照
  • ただし、使用できるのは Excel 97-2003 形式(*.xls)のみ
    • 実装で拡張子が xls のものしかハンドリングしていないので、 xlsx は読み込めない
    • Excel」とか「xlsx」で issue を検索しても何も引っかからないので、多分対応予定はなさそう
    • DBUnit 自体は xlsx も読み込めるので、条件追加するだけでよさそうだけど需要ないのかな?)

Database Rider 使い方メモ - Qiita

DBUnitを使いやすくしたというDatabase Riderというライブラリは、「.xls」のみの対応らしい、残念。

テスト駆動開発(Test-Driven Development)」は夢のまた夢ですかね...

毎度モヤモヤ感が半端ない...

今回はこのへんで。