androidTestで使うDBのデータをセットアップするという記事を以前書いた。
今回はこれをJUnitテストでも使えるようにしようとしてはまったポイント。
robolectricで使ってるsqliteの内部実装がdefer_foreign_keysに対応してないっぽくてどうしたもんかとなっている
— まつだあきひと (@akihito104) 2020年5月21日
今回の前提:
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