Android数据库测试-使用Room.inMemoryDatabaseBuilder()可以通过与Room.datab



我正在为应用程序的Room数据库编写单元测试。以下是使用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])。(我想我知道是什么原因导致了错误,我需要我没有自动生成的条目主键,所以在表中插入一个id已经存在的记录。无论如何,这不是我的问题。(

和同样的方法,使用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);
}

所以问题是为什么第一种方法失败了,第二种方法通过了?一个数据库是在内存中创建的,而另一个不是在内存中,这有什么区别?如果问题是使用唯一主键插入,那么这两种方法都不应该存在吗?除非这不是问题所在。

Room.databaseBuilder(..).build()不会在两次运行之间丢弃数据库,它是持久的。Room.inMemoryDatabaseBuilder(...).build()不是(当进程终止时,所有数据都会丢失(,这就是为什么在第一次运行测试时不会得到唯一的约束异常。

最新更新