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にデータをロードしてテストできる。もっといいやり方があれば教えてください。