我正在嘗試使用 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
提交
取消