我正在尝试使用 android-room 对我的 DAO 进行单元测试。我已经编写了一个可以正常工作的插入测试。不幸的是,删除方法似乎不起作用。我尝试了几种不同的测试设置。没有一个有效。这是 DAO:@Daopublic interface MonthlyDao { @Insert(onConflict = OnConflictStrategy.REPLACE) void saveAll(List<Monthly> goals); @Insert(onConflict = OnConflictStrategy.REPLACE) void save(Monthly goal); @Update void update(Monthly goal); @Delete void delete(Monthly goal); @Query("SELECT * FROM Monthly") LiveData<List<Monthly>> findAll(); @Query("SELECT * FROM monthly") List<Monthly> findAllList();}这是每月实体:@Entitypublic class Monthly { @PrimaryKey(autoGenerate = true) private int monthlyId; @TypeConverters(CalendarTypeConverter.class) @ColumnInfo(name = "date") private Calendar date = Calendar.getInstance(); @ColumnInfo(name = "title") private String title; @ColumnInfo(name = "description") private String description; @ColumnInfo(name = "completed") private boolean completed;... public int getMonthlyId() { return monthlyId; } public void setMonthlyId(int monthlyId) { this.monthlyId = monthlyId; }这是我正在运行的测试:@RunWith(AndroidJUnit4.class)public class MonthlyTest { private MonthlyDao monthlyDao; private MonthlyGoalsDatabase db; @Before public void createDb() { Context context = ApplicationProvider.getApplicationContext(); db = Room.inMemoryDatabaseBuilder(context, MonthlyGoalsDatabase.class).build(); monthlyDao = db.getMonthlyDao(); } @After public void closeDb() throws IOException { db.close(); }我将 UpdatedGoals 列表排除为空,但事实并非如此。仍然有我在测试时插入的目标。
1 回答
眼眸繁星
TA贡献1873条经验 获得超9个赞
注释的方法@Delete使用实体上的主键来知道要从数据库中删除哪一行(因为可能有多行具有相同的数据但不同的键)。
但是,您使用的是您创建的初始goal对象,该对象没有主键,因此不能用于指示要删除的行。
尝试这样做:
monthlyDao.save(goal);
List<Monthly> goals = monthlyDao.findAllList();
Assert.assertThat(goals.get(0).getTitle(), equalTo(goal.getTitle()));
monthlyDao.delete(goals.get(0)); // <-- Delete the goal returned from the find, which will have an ID
List<Monthly> updatedGoals = monthlyDao.findAllList();
Assert.assertTrue(updatedGoals.isEmpty());
这可以很容易地清理一下,但上面的示例只更改了一行,以明确问题所在。
添加回答
举报
0/150
提交
取消