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

我正在尝试使用 android-room 对我的 DAO 进行单元测试。我已经编写了一个可以正常工作的插入测试。不幸的是,删除方法似乎不起作用。


我尝试了几种不同的测试设置。没有一个有效。


这是 DAO:


@Dao

public 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();

}

这是每月实体:


@Entity

public 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 列表排除为空,但事实并非如此。仍然有我在测试时插入的目标。


万千封印
浏览 176回答 1
1回答

眼眸繁星

注释的方法@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 IDList<Monthly> updatedGoals = monthlyDao.findAllList();Assert.assertTrue(updatedGoals.isEmpty());这可以很容易地清理一下,但上面的示例只更改了一行,以明确问题所在。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java