Room のマイグレーションのテストに関しての公式のガイドがあるのですが、このサンプルコードで使われている MigrationTestHelper
のコンストラクタは deprecated になっていて、素直に書くと取り消し線が引かれている状態になっています:
ガイドはそのうち更新されるでしょうが、この機会に deprecated でないやりかたではどう書くのが良いか調べました:
deprecated のコンストラクタ
サンプルで使われている deprecated になっているコンストラクタはこれです:
引数に Instrumentation
, String
, SupportSQLiteOpenHelper.Factory
をとるコンストラクタです。
ページの注意書きにあるように、このコンストラクタではバージョン TODO
で導入された AutoMigration
の指定ができない (AutoMigrationSpec
による指定ができない) ので、新しいコンストラクタを使うことがオススメされているということですね。
オススメされたコンストラクタ
一方、これの代替となるコンストラクタは 3 つあります:
2 番目のコンストラクタが AutoMigration
に関する指定ができることがポイントで、一番使いそうなものではないでしょうか。使っていない場合は未指定にして 1 番目のコンストラクタを使うか、または 空のリストを渡すようにすればよいでしょう。
サンプルをオススメに書き換える
これをふまえてサンプルにある Test a single migration, Test all migrations の例を書き換えると
@get:Rule
val helper: MigrationTestHelper = MigrationTestHelper(
InstrumentationRegistry.getInstrumentation(),
- AppDatabase::class.java.canonicalName,
- FrameworkSQLiteOpenHelperFactory()
+ AppDatabase::class.java,
)
単に 3 番目の引数をなくしたコンストラクタ である 1 番目を使うのが良いということになるでしょう。
AutoMigration
を指定する場合
さらに AutoMigrationSpec
を指定した AutoMigration
がある場合は
@get:Rule
val helper: MigrationTestHelper = MigrationTestHelper(
InstrumentationRegistry.getInstrumentation(),
AppDatabase::class.java,
listOf(AppDatabase.AutoMigrationSpec1()),
)
必要な AutoMigrationSpec
のリストを 3 番目の引数に追加することで考慮できます。
あとはマイグレーションを行われた後の状態をテストするみたいなコードを書いてできあがりとなります:
@RunWith(AndroidJUnit4::class)
class MigrationTest {
private val TEST_DB = "migration-test"
// 1. 手動でのマイグレーションを列挙する
private val ALL_MIGRATIONS = arrayOf(MIGRATION_1_2)
@get:Rule
val helper: MigrationTestHelper = MigrationTestHelper(
InstrumentationRegistry.getInstrumentation(),
AppDatabase::class.java,
// 2. ここに必要な AutoMigratinSpec を列挙する (あれば)
listOf(
AppDatabase.AutoMigrationSpec1(),
),
)
@Test
@Throws(IOException::class)
fun migrateAll() {
helper.createDatabase(TEST_DB, 1).apply {
close()
}
Room.databaseBuilder(
InstrumentationRegistry.getInstrumentation().targetContext,
AppDatabase::class.java,
TEST_DB
).addMigrations(*ALL_MIGRATIONS).build().apply {
// 3. ここでマイグレーション後の状態の検証を行ったりできる
// ...
openHelper.writableDatabase.close()
}
}
}
なんてことはないですが、備忘録として。
誰かのお役に立てば幸いです。