fresh digitable

めんどくさかったなってことを振り返ったり振り返らなかったりするための記録

RobolectricのSQLiteの実装がPRAGMA defer_foreign_keysをサポートしていなかった

androidTestで使うDBのデータをセットアップするという記事を以前書いた。

akihito104.hatenablog.com

今回はこれをJUnitテストでも使えるようにしようとしてはまったポイント。

今回の前提:

testImplementation 'org.robolectric:robolectric:4.3'

言いたいことはタイトルですべて言っているので、どう対応したかということについて説明する。といってもそんなに難しいことはなく、単に PRAGMA defer_foreign_keys;を実行して戻り値があるかどうかを確認するだけである。

val isDeferForeignKeysSupported = supportSqliteDatabase.query("PRAGMA defer_foreign_keys;").use { cursor -> 
  cursor.count == 1
}
if (!isDeferForeignKeysSupported) supportSqliteDatabase.execSQL("PRAGMA foreign_keys = false;") // これは使えるらしい

supportSqliteDatabase.beginTransaction()

if (isDeferForeignKeysSupported) supportSqliteDatabase.execSQL("PRAGMA defer_foreign_keys = true;")
...

これでandroidTestでもJUnitTestでもDBにデータをロードしてテストできる。もっといいやり方があれば教えてください。

[2020/12/22 追記] robolectric 4.5-alpha-1以上なら大丈夫かもしれない akihito104.hatenablog.com