Android Room Test Удалить не работает (Java) - PullRequest
1 голос
/ 20 сентября 2019

Я пытаюсь протестировать мой DAO с помощью Android-комнаты.Я написал тест вставки, который работает правильно.К сожалению, метод удаления, похоже, не работает.

Я попробовал несколько различных настроек для теста.Ничего не сработало.

Вот 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());
    }

Я, кроме обновленного списка целей, должен быть пустым, но это не так.Есть цель, которую я вставил во время теста.

1 Ответ

4 голосов
/ 20 сентября 2019

Метод, помеченный @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());

Это можно легко исправить, но приведенный выше пример изменяет только одну строку, чтобы прояснить причину проблемы.

См. здесь для соответствующей документации.

...