Я пишу юнит-тесты для базы данных комнаты приложения. Вот соответствующий код при использовании 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);
}
Итак, вопрос в том, почему первый метод дает сбой, а второй проходит? Какая разница, что одна база данных создается в памяти, а другая нет? Если проблема заключается в вставке с уникальными первичными ключами, не должно ли это присутствовать в обоих методах? Если это не проблема здесь.