Тестирование базы данных Andorid - использование Room.inMemoryDatabaseBuilder () проходит тот же тест, что и Room.databaseBuilder () - PullRequest
0 голосов
/ 21 апреля 2020

Я пишу юнит-тесты для базы данных комнаты приложения. Вот соответствующий код при использовании Room.databaseBuilder()

@Before
public void createDb() {
    Context context = ApplicationProvider.getApplicationContext();
    db = Room.databaseBuilder(context, AppDatabase.class, "AppDatabase").build();
    itemDao = db.itemDao();
}

. Тест не пройден и ошибка android.database.sqlite.SQLiteConstraintException: UNIQUE constraint failed: item.id (code 1555 SQLITE_CONSTRAINT_PRIMARYKEY[1555]). (Я думаю, я знаю, что вызывает ошибку, мне нужно, чтобы у меня не было автоматически сгенерированного первичного ключа для записей, поэтому запись вставляется с идентификатором, уже находящимся в таблице. В любом случае, это не тот вопрос, который у меня есть.)

И тот же метод, используя Room.inMemoryDatabaseBuilder(). Здесь тест проходит.

@Before
void createDb() {
    Context context = ApplicationProvider.getApplicationContext();
    db = Room.inMemoryDatabaseBuilder(context, AppDatabase.class).build();
    itemDao = db.itemDao();
}

И сам тест:

@Test
public void writeItemAndReadInList() {
    float value = 3.0f;
    Item item = new Item(value, new Date());
    itemDao.insert(item);
    List<Item> all = itemDao.getAll();
    assertEquals(all.get(0).getValue(), value);
}

Итак, вопрос в том, почему первый метод дает сбой, а второй проходит? Какая разница, что одна база данных создается в памяти, а другая нет? Если проблема заключается в вставке с уникальными первичными ключами, не должно ли это присутствовать в обоих методах? Если это не проблема здесь.

1 Ответ

0 голосов
/ 21 апреля 2020

Room.databaseBuilder(..).build() не удалит вашу базу данных между запусками, она постоянна. Room.inMemoryDatabaseBuilder(...).build() это не так (все данные теряются при остановке процесса), поэтому при первом запуске теста вы не получаете уникальные исключения из ограничений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...