0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Room MigrationTestHelper のコンストラクタ deprecated 対応メモ

Posted at

Room のマイグレーションのテストに関しての公式のガイドがあるのですが、このサンプルコードで使われている MigrationTestHelper のコンストラクタは deprecated になっていて、素直に書くと取り消し線が引かれている状態になっています:

ガイドはそのうち更新されるでしょうが、この機会に deprecated でないやりかたではどう書くのが良いか調べました:

depreacted.png

deprecated のコンストラクタ

サンプルで使われている deprecated になっているコンストラクタはこれです:

引数に Instrumentation, String, SupportSQLiteOpenHelper.Factory をとるコンストラクタです。

MigrationTestHelper_ _ _Android_Developers.png

ページの注意書きにあるように、このコンストラクタではバージョン TODO で導入された AutoMigration の指定ができない (AutoMigrationSpec による指定ができない) ので、新しいコンストラクタを使うことがオススメされているということですね。

オススメされたコンストラクタ

一方、これの代替となるコンストラクタは 3 つあります:

MigrationTestHelper_ _ _Android_Developers-3.png
MigrationTestHelper_ _ _Android_Developers-2.png
MigrationTestHelper_ _ _Android_Developers-4.png

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()
        }
    }

}

なんてことはないですが、備忘録として。
誰かのお役に立てば幸いです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?