# MigrationTestHelper

Artifact: [androidx.room3:room3-testing](https://developer.android.com/jetpack/androidx/releases/room3) [View Source](https://cs.android.com/search?q=file:androidx/room3/testing/MigrationTestHelper.+class:androidx.room3.testing.MigrationTestHelper) Added in [3.0.0](https://developer.android.com/jetpack/androidx/releases/room3#3.0.0)

*** ** * ** ***

Common/AllAndroid/JVMNative/C/iOSJavaScript
- Cmn

  ```
  class MigrationTestHelper
  ```
- android

  ```
  open class MigrationTestHelper
  ```

*** ** * ** ***

A class that can help test and verify database creation and migration at different versions with different schemas.

Common usage of this helper is to create a database at an older version first and then attempt a migration and validation:

```kotlin
@Test
fun migrationTest() {
  val migrationTestHelper = getMigrationTestHelper()
  // Create the database at version 1
  val newConnection = migrationTestHelper.createDatabase(1)
  // Insert some data that should be preserved
  newConnection.execSQL("INSERT INTO Pet (id, name) VALUES (1, 'Tom')")
  newConnection.close()

  // Migrate the database to version 2
  val migratedConnection =
      migrationTestHelper.runMigrationsAndValidate(2, listOf(MIGRATION_1_2)))
  migratedConnection.prepare("SELECT * FROM Pet).use { stmt ->
    // Validates data is preserved between migrations.
    assertThat(stmt.step()).isTrue()
    assertThat(stmt.getText(1)).isEqualTo("Tom")
  }
  migratedConnection.close()
}
```

The helper relies on exported schemas so `https://developer.android.com/reference/kotlin/androidx/room3/Database#exportSchema()` should be enabled. Schema location should be configured via Room's Gradle Plugin (id 'androidx.room'):

```kotlin
room {
  schemaDirectory("$projectDir/schemas")
}
```

The helper is then instantiated to use the same schema location where they are exported to. See platform-specific documentation for further configuration.

## Summary

| ### Public constructors |
|---|---|
| `https://developer.android.com/reference/kotlin/androidx/room3/testing/MigrationTestHelper#MigrationTestHelper()()` | JS |
| `https://developer.android.com/reference/kotlin/androidx/room3/testing/MigrationTestHelper#MigrationTestHelper(android.app.Instrumentation,java.io.File,androidx.sqlite.SQLiteDriver,kotlin.reflect.KClass,kotlin.Function0,kotlin.collections.List)( instrumentation: https://developer.android.com/reference/android/app/Instrumentation.html, file: https://developer.android.com/reference/java/io/File.html, driver: https://developer.android.com/reference/kotlin/androidx/sqlite/SQLiteDriver, databaseClass: https://kotlinlang.org/api/core/kotlin-stdlib/kotlin.reflect/-k-class/index.html<https://developer.android.com/reference/kotlin/androidx/room3/RoomDatabase>, databaseFactory: () -> https://developer.android.com/reference/kotlin/androidx/room3/RoomDatabase, autoMigrationSpecs: https://kotlinlang.org/api/core/kotlin-stdlib/kotlin.collections/-list/index.html<https://developer.android.com/reference/kotlin/androidx/room3/migration/AutoMigrationSpec> )` Creates a new migration helper. | android |
| `https://developer.android.com/reference/kotlin/androidx/room3/testing/MigrationTestHelper#MigrationTestHelper(java.nio.file.Path,java.nio.file.Path,androidx.sqlite.SQLiteDriver,kotlin.reflect.KClass,kotlin.Function0,kotlin.collections.List)( schemaDirectoryPath: https://developer.android.com/reference/java/nio/file/Path.html, databasePath: https://developer.android.com/reference/java/nio/file/Path.html, driver: https://developer.android.com/reference/kotlin/androidx/sqlite/SQLiteDriver, databaseClass: https://kotlinlang.org/api/core/kotlin-stdlib/kotlin.reflect/-k-class/index.html<https://developer.android.com/reference/kotlin/androidx/room3/RoomDatabase>, databaseFactory: () -> https://developer.android.com/reference/kotlin/androidx/room3/RoomDatabase, autoMigrationSpecs: https://kotlinlang.org/api/core/kotlin-stdlib/kotlin.collections/-list/index.html<https://developer.android.com/reference/kotlin/androidx/room3/migration/AutoMigrationSpec> )` | android |
| `https://developer.android.com/reference/kotlin/androidx/room3/testing/MigrationTestHelper#MigrationTestHelper(kotlin.String,kotlin.String,androidx.sqlite.SQLiteDriver,kotlin.reflect.KClass,kotlin.Function0,kotlin.collections.List)( schemaDirectoryPath: https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-string/index.html, fileName: https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-string/index.html, driver: https://developer.android.com/reference/kotlin/androidx/sqlite/SQLiteDriver, databaseClass: https://kotlinlang.org/api/core/kotlin-stdlib/kotlin.reflect/-k-class/index.html<https://developer.android.com/reference/kotlin/androidx/room3/RoomDatabase>, databaseFactory: () -> https://developer.android.com/reference/kotlin/androidx/room3/RoomDatabase, autoMigrationSpecs: https://kotlinlang.org/api/core/kotlin-stdlib/kotlin.collections/-list/index.html<https://developer.android.com/reference/kotlin/androidx/room3/migration/AutoMigrationSpec> )` | N |

| ### Public functions |
|---|---|---|
| `https://junit.org/junit4/javadoc/latest/org/junit/runners/model/Statement.html` | `https://developer.android.com/reference/kotlin/androidx/room3/testing/MigrationTestHelper#apply(org.junit.runners.model.Statement,org.junit.runner.Description)(base: https://junit.org/junit4/javadoc/latest/org/junit/runners/model/Statement.html, description: https://junit.org/junit4/javadoc/latest/org/junit/runner/Description.html)` | android |
| `https://junit.org/junit4/javadoc/latest/org/junit/runners/model/Statement.html` | `https://developer.android.com/reference/kotlin/androidx/room3/testing/MigrationTestHelper#apply(org.junit.runners.model.Statement,org.junit.runner.Description)(base: https://junit.org/junit4/javadoc/latest/org/junit/runners/model/Statement.html, description: https://junit.org/junit4/javadoc/latest/org/junit/runner/Description.html)` | android |
| `open https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-unit/index.html` | `https://developer.android.com/reference/kotlin/androidx/room3/testing/MigrationTestHelper#closeWhenFinished(androidx.room3.RoomDatabase)(db: https://developer.android.com/reference/kotlin/androidx/room3/RoomDatabase)` Registers a database connection to be automatically closed when the test finishes. | android |
| `suspend https://developer.android.com/reference/kotlin/androidx/sqlite/SQLiteConnection` | `https://developer.android.com/reference/kotlin/androidx/room3/testing/MigrationTestHelper#createDatabase(kotlin.Int)(version: https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-int/index.html)` Creates the database at the given version. | Cmn android N JS |
| `https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-unit/index.html` | `https://developer.android.com/reference/kotlin/androidx/room3/testing/MigrationTestHelper#finished()()` | N |
| `suspend https://developer.android.com/reference/kotlin/androidx/sqlite/SQLiteConnection` | `https://developer.android.com/reference/kotlin/androidx/room3/testing/MigrationTestHelper#runMigrationsAndValidate(kotlin.Int,kotlin.collections.List)(version: https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-int/index.html, migrations: https://kotlinlang.org/api/core/kotlin-stdlib/kotlin.collections/-list/index.html<https://developer.android.com/reference/kotlin/androidx/room3/migration/Migration>)` Runs the given set of migrations on the existing database once created via `https://developer.android.com/reference/kotlin/androidx/room3/testing/MigrationTestHelper#createDatabase(kotlin.Int)`. | Cmn android N JS |

| ### Protected functions |
|---|---|---|
| `https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-unit/index.html` | `https://developer.android.com/reference/kotlin/androidx/room3/testing/MigrationTestHelper#failed(java.lang.Throwable,org.junit.runner.Description)(e: https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-throwable/index.html, description: https://junit.org/junit4/javadoc/latest/org/junit/runner/Description.html)` | android |
| `https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-unit/index.html` | `https://developer.android.com/reference/kotlin/androidx/room3/testing/MigrationTestHelper#failed(java.lang.Throwable,org.junit.runner.Description)(e: https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-throwable/index.html, description: https://junit.org/junit4/javadoc/latest/org/junit/runner/Description.html)` | android |
| `open https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-unit/index.html` | `https://developer.android.com/reference/kotlin/androidx/room3/testing/MigrationTestHelper#finished(org.junit.runner.Description)(description: https://junit.org/junit4/javadoc/latest/org/junit/runner/Description.html?)` | android |
| `open https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-unit/index.html` | `https://developer.android.com/reference/kotlin/androidx/room3/testing/MigrationTestHelper#finished(org.junit.runner.Description)(description: https://junit.org/junit4/javadoc/latest/org/junit/runner/Description.html?)` | android |
| `https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-unit/index.html` | `https://developer.android.com/reference/kotlin/androidx/room3/testing/MigrationTestHelper#skipped(org.junit.internal.AssumptionViolatedException,org.junit.runner.Description)( e: org.junit.internal.AssumptionViolatedException, description: https://junit.org/junit4/javadoc/latest/org/junit/runner/Description.html )` | android |
| `https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-unit/index.html` | `https://developer.android.com/reference/kotlin/androidx/room3/testing/MigrationTestHelper#skipped(org.junit.internal.AssumptionViolatedException,org.junit.runner.Description)( e: org.junit.internal.AssumptionViolatedException, description: https://junit.org/junit4/javadoc/latest/org/junit/runner/Description.html )` | android |
| `https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-unit/index.html` | `https://developer.android.com/reference/kotlin/androidx/room3/testing/MigrationTestHelper#skipped(org.junit.AssumptionViolatedException,org.junit.runner.Description)(e: https://junit.org/junit4/javadoc/latest/org/junit/AssumptionViolatedException.html, description: https://junit.org/junit4/javadoc/latest/org/junit/runner/Description.html)` | android |
| `https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-unit/index.html` | `https://developer.android.com/reference/kotlin/androidx/room3/testing/MigrationTestHelper#skipped(org.junit.AssumptionViolatedException,org.junit.runner.Description)(e: https://junit.org/junit4/javadoc/latest/org/junit/AssumptionViolatedException.html, description: https://junit.org/junit4/javadoc/latest/org/junit/runner/Description.html)` | android |
| `open https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-unit/index.html` | `https://developer.android.com/reference/kotlin/androidx/room3/testing/MigrationTestHelper#starting(org.junit.runner.Description)(description: https://junit.org/junit4/javadoc/latest/org/junit/runner/Description.html?)` | android |
| `https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-unit/index.html` | `https://developer.android.com/reference/kotlin/androidx/room3/testing/MigrationTestHelper#starting(org.junit.runner.Description)(description: https://junit.org/junit4/javadoc/latest/org/junit/runner/Description.html)` | android |
| `https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-unit/index.html` | `https://developer.android.com/reference/kotlin/androidx/room3/testing/MigrationTestHelper#succeeded(org.junit.runner.Description)(description: https://junit.org/junit4/javadoc/latest/org/junit/runner/Description.html)` | android |
| `https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-unit/index.html` | `https://developer.android.com/reference/kotlin/androidx/room3/testing/MigrationTestHelper#succeeded(org.junit.runner.Description)(description: https://junit.org/junit4/javadoc/latest/org/junit/runner/Description.html)` | android |

## Public constructors

### MigrationTestHelper

JS

```
MigrationTestHelper()
```

### MigrationTestHelper

android

```
MigrationTestHelper(
    instrumentation: Instrumentation,
    file: File,
    driver: SQLiteDriver,
    databaseClass: KClass<RoomDatabase>,
    databaseFactory: () -> RoomDatabase = {
            findAndInstantiateDatabaseImpl(databaseClass.java)
        },
    autoMigrationSpecs: List<AutoMigrationSpec> = emptyList()
)
```

Creates a new migration helper. It uses the `https://developer.android.com/reference/kotlin/androidx/room3/testing/MigrationTestHelper#(android.app.Instrumentation,java.io.File,androidx.sqlite.SQLiteDriver,kotlin.reflect.KClass,kotlin.Function0,kotlin.collections.List)` context to load the schema (falls back to the app resources) and the target context to create the database.

When the `https://developer.android.com/reference/kotlin/androidx/room3/testing/MigrationTestHelper` is created with this constructor configuration then only `https://developer.android.com/reference/kotlin/androidx/room3/testing/MigrationTestHelper#createDatabase(kotlin.Int)` and `https://developer.android.com/reference/kotlin/androidx/room3/testing/MigrationTestHelper#runMigrationsAndValidate(kotlin.Int,kotlin.collections.List)` that return `https://developer.android.com/reference/kotlin/androidx/sqlite/SQLiteConnection` can be used.

| Parameters |
|---|---|
| `instrumentation: https://developer.android.com/reference/android/app/Instrumentation.html` | The instrumentation instance. |
| `file: https://developer.android.com/reference/java/io/File.html` | The database file. |
| `driver: https://developer.android.com/reference/kotlin/androidx/sqlite/SQLiteDriver` | A driver that opens connection to a file database. A driver that opens connections to an in-memory database would be meaningless. |
| `databaseClass: https://kotlinlang.org/api/core/kotlin-stdlib/kotlin.reflect/-k-class/index.html<https://developer.android.com/reference/kotlin/androidx/room3/RoomDatabase>` | The `https://developer.android.com/reference/kotlin/androidx/room3/Database` annotated class. |
| `databaseFactory: () -> https://developer.android.com/reference/kotlin/androidx/room3/RoomDatabase = { findAndInstantiateDatabaseImpl(databaseClass.java) }` | An optional factory function to create an instance of the `https://developer.android.com/reference/kotlin/androidx/room3/testing/MigrationTestHelper#(android.app.Instrumentation,java.io.File,androidx.sqlite.SQLiteDriver,kotlin.reflect.KClass,kotlin.Function0,kotlin.collections.List)`. Should be the same factory used when building the database via `https://developer.android.com/reference/kotlin/androidx/room3/Room#databaseBuilder(android.content.Context,java.lang.Class,kotlin.String)`. |
| `autoMigrationSpecs: https://kotlinlang.org/api/core/kotlin-stdlib/kotlin.collections/-list/index.html<https://developer.android.com/reference/kotlin/androidx/room3/migration/AutoMigrationSpec> = emptyList()` | The list of `https://developer.android.com/reference/kotlin/androidx/room3/ProvidedAutoMigrationSpec` instances for `https://developer.android.com/reference/kotlin/androidx/room3/AutoMigration`s that require them. |

### MigrationTestHelper

android

```
MigrationTestHelper(
    schemaDirectoryPath: Path,
    databasePath: Path,
    driver: SQLiteDriver,
    databaseClass: KClass<RoomDatabase>,
    databaseFactory: () -> RoomDatabase = { findAndInstantiateDatabaseImpl(databaseClass.java) },
    autoMigrationSpecs: List<AutoMigrationSpec> = emptyList()
)
```

| Parameters |
|---|---|
| `schemaDirectoryPath: https://developer.android.com/reference/java/nio/file/Path.html` | The schema directory where schema files are exported. |
| `databasePath: https://developer.android.com/reference/java/nio/file/Path.html` | Name of the database. |
| `driver: https://developer.android.com/reference/kotlin/androidx/sqlite/SQLiteDriver` | A driver that opens connection to a file database. A driver that opens connections to an in-memory database would be meaningless. |
| `databaseClass: https://kotlinlang.org/api/core/kotlin-stdlib/kotlin.reflect/-k-class/index.html<https://developer.android.com/reference/kotlin/androidx/room3/RoomDatabase>` | The `https://developer.android.com/reference/kotlin/androidx/room3/Database` annotated class. |
| `databaseFactory: () -> https://developer.android.com/reference/kotlin/androidx/room3/RoomDatabase = { findAndInstantiateDatabaseImpl(databaseClass.java) }` | An optional factory function to create an instance of the `https://developer.android.com/reference/kotlin/androidx/room3/testing/MigrationTestHelper#databaseClass()`. Should be the same factory used when building the database via `https://developer.android.com/reference/kotlin/androidx/room3/Room#databaseBuilder(kotlin.String,kotlin.Function0)`. |
| `autoMigrationSpecs: https://kotlinlang.org/api/core/kotlin-stdlib/kotlin.collections/-list/index.html<https://developer.android.com/reference/kotlin/androidx/room3/migration/AutoMigrationSpec> = emptyList()` | The list of `https://developer.android.com/reference/kotlin/androidx/room3/ProvidedAutoMigrationSpec` instances for `https://developer.android.com/reference/kotlin/androidx/room3/AutoMigration`s that require them. |

### MigrationTestHelper

N

```
MigrationTestHelper(
    schemaDirectoryPath: String,
    fileName: String,
    driver: SQLiteDriver,
    databaseClass: KClass<RoomDatabase>,
    databaseFactory: () -> RoomDatabase = {
        findDatabaseConstructorAndInitDatabaseImpl(databaseClass)
    },
    autoMigrationSpecs: List<AutoMigrationSpec> = emptyList()
)
```

| Parameters |
|---|---|
| `schemaDirectoryPath: https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-string/index.html` | The schema directory where schema files are exported. |
| `fileName: https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-string/index.html` | Name of the database. |
| `driver: https://developer.android.com/reference/kotlin/androidx/sqlite/SQLiteDriver` | A driver that opens connection to a file database. A driver that opens connections to an in-memory database would be meaningless. |
| `databaseClass: https://kotlinlang.org/api/core/kotlin-stdlib/kotlin.reflect/-k-class/index.html<https://developer.android.com/reference/kotlin/androidx/room3/RoomDatabase>` | The `https://developer.android.com/reference/kotlin/androidx/room3/Database` annotated class. |
| `databaseFactory: () -> https://developer.android.com/reference/kotlin/androidx/room3/RoomDatabase = { findDatabaseConstructorAndInitDatabaseImpl(databaseClass) }` | The factory function to create an instance of the `https://developer.android.com/reference/kotlin/androidx/room3/testing/MigrationTestHelper#databaseClass()`. Should be the same factory used when building the database via `https://developer.android.com/reference/kotlin/androidx/room3/Room#databaseBuilder(kotlin.String,kotlin.Function0)`. |
| `autoMigrationSpecs: https://kotlinlang.org/api/core/kotlin-stdlib/kotlin.collections/-list/index.html<https://developer.android.com/reference/kotlin/androidx/room3/migration/AutoMigrationSpec> = emptyList()` | The list of `https://developer.android.com/reference/kotlin/androidx/room3/ProvidedAutoMigrationSpec` instances for `https://developer.android.com/reference/kotlin/androidx/room3/AutoMigration`s that require them. |

## Public functions

### apply

android

```
fun apply(base: Statement, description: Description): Statement
```

### apply

android

```
fun apply(base: Statement, description: Description): Statement
```

### closeWhenFinished

android Added in [3.0.0](https://developer.android.com/jetpack/androidx/releases/room3#3.0.0)

```
open fun closeWhenFinished(db: RoomDatabase): Unit
```

Registers a database connection to be automatically closed when the test finishes.

This only works if `https://developer.android.com/reference/kotlin/androidx/room3/testing/MigrationTestHelper` is registered as a Junit test rule via the `https://junit.org/junit4/javadoc/latest/org/junit/Rule.html` annotation.

| Parameters |
|---|---|
| `db: https://developer.android.com/reference/kotlin/androidx/room3/RoomDatabase` | The RoomDatabase instance which holds the database. |

### createDatabase

Cmn android N JS

```
suspend fun createDatabase(version: Int): SQLiteConnection
```

Creates the database at the given version.

Once a database is created it can further validate with `https://developer.android.com/reference/kotlin/androidx/room3/testing/MigrationTestHelper#runMigrationsAndValidate(kotlin.Int,kotlin.collections.List)`.

| Parameters |
|---|---|
| `version: https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-int/index.html` | The version of the schema at which the database should be created. |

| Returns |
|---|---|
| `https://developer.android.com/reference/kotlin/androidx/sqlite/SQLiteConnection` | A database connection of the newly created database. |

| Throws |
|---|---|
| `https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-illegal-state-exception/index.html` | If a new database was not created. |

### finished

N

```
fun finished(): Unit
```

### runMigrationsAndValidate

Cmn android N JS

```
suspend fun runMigrationsAndValidate(
    version: Int,
    migrations: List<Migration> = emptyList()
): SQLiteConnection
```

Runs the given set of migrations on the existing database once created via `https://developer.android.com/reference/kotlin/androidx/room3/testing/MigrationTestHelper#createDatabase(kotlin.Int)`.

This function uses the same algorithm that Room performs to choose migrations such that the `https://developer.android.com/reference/kotlin/androidx/room3/testing/MigrationTestHelper#runMigrationsAndValidate(kotlin.Int,kotlin.collections.List)` instances provided must be sufficient to bring the database from current version to the desired version. If the database contains `https://developer.android.com/reference/kotlin/androidx/room3/AutoMigration`s, then those are already included in the list of migrations to execute if necessary. Note that provided manual migrations take precedence over auto migrations if they overlap in migration paths.

Once migrations are done, this functions validates the database schema to ensure the migration performed resulted in the expected schema.

| Parameters |
|---|---|
| `version: https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-int/index.html` | The final version the database should migrate to. |
| `migrations: https://kotlinlang.org/api/core/kotlin-stdlib/kotlin.collections/-list/index.html<https://developer.android.com/reference/kotlin/androidx/room3/migration/Migration> = emptyList()` | The list of migrations used to attempt the database migration. |

| Returns |
|---|---|
| `https://developer.android.com/reference/kotlin/androidx/sqlite/SQLiteConnection` | A database connection of the migrated database. |

| Throws |
|---|---|
| `https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-illegal-state-exception/index.html` | If the schema validation fails. |

## Protected functions

### failed

android

```
protected fun failed(e: Throwable, description: Description): Unit
```

### failed

android

```
protected fun failed(e: Throwable, description: Description): Unit
```

### finished

android

```
protected open fun finished(description: Description?): Unit
```

### finished

android

```
protected open fun finished(description: Description?): Unit
```

### skipped

android

```
protected fun skipped(
    e: org.junit.internal.AssumptionViolatedException,
    description: Description
): Unit
```

### skipped

android

```
protected fun skipped(
    e: org.junit.internal.AssumptionViolatedException,
    description: Description
): Unit
```

### skipped

android

```
protected fun skipped(e: AssumptionViolatedException, description: Description): Unit
```

### skipped

android

```
protected fun skipped(e: AssumptionViolatedException, description: Description): Unit
```

### starting

android

```
protected open fun starting(description: Description?): Unit
```

### starting

android

```
protected fun starting(description: Description): Unit
```

### succeeded

android

```
protected fun succeeded(description: Description): Unit
```

### succeeded

android

```
protected fun succeeded(description: Description): Unit
```