[英]Android Room Test Delete Not Working (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();
}
@Test
public void deleteGoal() throws Exception {
String title = "test delete title";
Calendar date = Calendar.getInstance();
date.set(Calendar.HOUR_OF_DAY, 0);
String desc = "test delete desc";
Monthly goal = new Monthly(title, date, desc);
monthlyDao.save(goal);
List<Monthly> goals = monthlyDao.findAllList();
Assert.assertThat(goals.get(0).getTitle(), equalTo(goal.getTitle()));
monthlyDao.delete(goal);
List<Monthly> updatedGoals = monthlyDao.findAllList();
Assert.assertTrue(updatedGoals.isEmpty());
}
我除了 updatedGoals 列表為空之外,但事實並非如此。 還有我在測試期間插入的目標。
使用@Delete
注釋的方法使用實體上的主鍵來知道要從數據庫中刪除哪一行(因為可能有多行具有相同的數據但不同的鍵)。
但是,您使用的是您創建的初始goal
object,它沒有主鍵,因此不能用於指示要刪除的行。
嘗試這樣做:
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());
這可以很容易地清理一下,但上面的例子只改變了一行,以明確問題出在哪里。
有關相關文檔,請參見此處。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.