Saya mencoba menguji unit DAO saya menggunakan Android-room. Saya telah menulis tes sisipan yang berfungsi dengan baik. Sayangnya, metode penghapusan tampaknya tidak berfungsi.

Saya sudah mencoba beberapa pengaturan berbeda untuk pengujian. Tidak ada yang berhasil.

Berikut DAOnya:

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

Berikut adalah entitas Bulanan:

@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;
    }

Dan inilah tes yang saya jalankan:

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

Saya kecuali daftar updatedGoals kosong, tetapi tidak. Masih ada tujuan yang saya masukkan selama tes.

1
BlorbieRandy 20 September 2019, 21:32

1 menjawab

Jawaban Terbaik

Metode yang dianotasi dengan @Delete menggunakan kunci utama pada entitas untuk mengetahui baris mana yang harus dihapus dari database (karena mungkin ada beberapa baris dengan data yang sama tetapi kunci yang berbeda).

Namun, Anda menggunakan objek goal awal yang Anda buat, yang tidak memiliki kunci utama, dan dengan demikian tidak dapat digunakan untuk menunjukkan baris mana yang akan dihapus.

Coba lakukan ini:

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

Itu dapat dengan mudah dibersihkan sedikit, tetapi contoh di atas hanya mengubah satu baris, untuk memperjelas di mana masalahnya.

Lihat di sini untuk dokumentasi yang relevan.

7
Jordan 20 September 2019, 18:53