gpt4 book ai didi

java - Android Room 测试删除不工作(Java)

转载 作者:行者123 更新时间:2023-11-28 20:19:29 24 4
gpt4 key购买 nike

我正在尝试使用 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 对象,该对象没有主键,因此不能用于指示要删除的行。

尝试这样做:

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

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

参见 here获取相关文档。

关于java - Android Room 测试删除不工作(Java),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58033588/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com