Android Тест миграции помещения не прошел, хотя ничего не изменилось - PullRequest
3 голосов
/ 28 мая 2020

Я пытаюсь протестировать миграцию комнаты, но тест всегда терпит неудачу. Даже в модели нет изменений. Я только увеличиваю номер версии, а миграция пуста - тест все равно не проходит. Я не понимаю, что я делаю не так.

Допустим, у нас есть объект 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). Однако тест не проходит!

1 Ответ

0 голосов
/ 30 мая 2020

Если вы еще этого не сделали, вы можете проверить эту хорошую статью о тестировании миграции: https://medium.com/androiddevelopers/testing-room-migrations-be93cdb0d975

Затем в процессе миграции вам необходимо фактически перенести базу данных, выполнить SQL - go от 1 до 2, например, путем создания индексов.

Room обрабатывает цепочку миграции, целостность структуры и тестирование, но не саму миграцию. В документации https://developer.android.com/training/data-storage/room/migrating-db-versions они выполняют миграции своей базы данных, вы должны сделать то же самое.

...