またもやGMTの罠。

久しぶりにはまった。
なんでjava.sql.Dateってequalsメソッドをオーバーライドしないんだ?
そもそもDBのDATE型に対応するための型なんだから、日付が同じなら一致とみなしてくれれぱいいのに。
まあ一口にDATE型といっても、時間まで保持するRDBもあるけどね。。。


プロジェクトでDBUnitを導入しようかという話になってその検証中、コードで設定した値とDBから取得した値が一致しない。
まあ大体ここらあたりで何かしら問題が出るだろうなと思ってたから原因はすぐわかったけど。。。
最初は安直にnew java.sql.Date(System.currentTimeMillis() / 86400000 * 86400000)とかやったけどダメだった。
つい最近誰かがツイートしてたが、0時が何ミリ秒にあたるかなんてそりゃ地域によって違うもんな。
こんなことくらいで一々Calendar#getInstance()して時間クリアしてなんてことしたくないんだけど。。。
TimeZone#getRawOffset()を反映させればいいのかな?


DBUnitってsymfowareに対応してないのね。
どっちかってーとsymfowareがJDBC-APIをサポートしなさすぎなんだけど・・・
DBUnitを起動してみたらsetFetchSizeなんてメソッドは使えねーよ的なエラーが起きた。
ソースを見てみるとprivateメソッドの中でフツーにそのメソッドが呼ばれていて、設定やら何やらで回避できるものではなさそう。
仕方なくFowrardなんちゃらTableクラスとそのファクトリ、CacheなんちゃらTableとそのファクトリのソースをコピーしてsymfoware用にカスタマイズ。
何とか動いた。
テストが自動化できるのはありがたいが、テストデータの作成やら検証部分のテストコードの記述やらやたら大変な気が。
何とかならんもんかね?