为了账号安全,请及时绑定邮箱和手机立即绑定

Android Room 测试删除不起作用 (Java)

Android Room 测试删除不起作用 (Java)

万千封印 2023-08-16 09:40:53
我正在尝试使用 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());

这可以很容易地清理一下,但上面的示例只更改了一行,以明确问题所在。


查看完整回答
反对 回复 2023-08-16
  • 1 回答
  • 0 关注
  • 175 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信