Я пытаюсь протестировать миграцию комнаты, но тест всегда терпит неудачу. Даже в модели нет изменений. Я только увеличиваю номер версии, а миграция пуста - тест все равно не проходит. Я не понимаю, что я делаю не так.
Допустим, у нас есть объект EntityExample
с двумя столбцами a
и b
. Первичный ключ состоит из a
и b
, и у нас есть индексы для обоих столбцов. Код выглядит так:
@Entity(primaryKeys = {"a", "b"}, indices = {@Index("a"), @Index("b")})
public class EntityExample {
@NonNull public Long a;
@NonNull public Long b;
}
Далее наша база данных в версии 1:
@Database(version=1,entities={EntityExample.class})
public abstract class DBExample extends RoomDatabase {
}
и в версии 2:
@Database(version=2,entities={EntityExample.class})
public abstract class DBExample extends RoomDatabase {
}
Также есть миграции:
public class MigrationExample {
public final static Migration MIGRATION_1_2 = new Migration(1,2) {
@Override
public void migrate(@NonNull SupportSQLiteDatabase database) {
}
};
}
Для доступа к схеме в тестах в build.gradle добавлено:
android {
sourceSets {
// Adds exported schema location as test app assets.
debug.assets.srcDirs += files("$projectDir/schemas".toString())
}
}
И, наконец, тест:
@Config(sdk = Build.VERSION_CODES.O_MR1)
@RunWith(RobolectricTestRunner.class)
public class MigrationExampleTest {
@Rule
public MigrationTestHelper helper;
public MigrationExampleTest() {
helper = new MigrationTestHelper(InstrumentationRegistry.getInstrumentation(),
DBExample.class.getCanonicalName(),
new FrameworkSQLiteOpenHelperFactory());
}
@Test
public void migrationTest() throws IOException {
SupportSQLiteDatabase dbV1 = helper.createDatabase("migration-test", 1);
dbV1.close();
DBExample dbV2 = Room.databaseBuilder(
InstrumentationRegistry.getInstrumentation().getTargetContext(),
DBExample.class,
"migration-test")
.addMigrations(MigrationExample.MIGRATION_1_2)
.build();
dbV2.getOpenHelper().getWritableDatabase();
dbV2.close();
}
}
Тест не проходит в строке dbV2.getOpenHelper().getWritableDatabase();
с
java.lang.IllegalStateException: Migration didn't properly handle: EntityExample(....EntityExample).
Expected:
TableInfo{name='EntityExample', columns={a=Column{name='a', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=1, defaultValue='null'}, b=Column{name='b', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=2, defaultValue='null'}}, foreignKeys=[], indices=[Index{name='index_EntityExample_a', unique=false, columns=[a]}, Index{name='index_EntityExample_b', unique=false, columns=[b]}]}
Found:
TableInfo{name='EntityExample', columns={a=Column{name='a', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=1, defaultValue='null'}, b=Column{name='b', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=1, defaultValue='null'}}, foreignKeys=[], indices=null}
Как вы можете видеть (при прокрутке результатов теста вправо), часть index отсутствует в найденной TableInfo . Кроме того, primaryKeyPosition для b
отличается от 1 до 2. Я не понимаю, почему, я не знаю, что именно вызывает сбой теста, и я не знаю, как это исправить. . Запуск приложения работает, никаких исключений не выдается. Я проверил схемы, они полностью совпадают, за исключением номера обновленной версии (см. https://justpaste.it/68l2b и https://justpaste.it/3r45p). Однако тест не проходит!