RxJava2 TestSubscriber assertEmpty总是如此

时间:2018-06-10 19:20:10

标签: android rx-java2 android-testing android-room

我正在尝试使用TestSubsriber测试一些RxJava代码。数据来自Room ORM Flowable<Task>

这就是我的DAO课程现在的样子。

@Dao
public interface TaskDao {

    @Insert()
    long insertTask(TaskEntity task);

    @Delete
    int deleteTask(TaskEntity task);

    @Query("SELECT * FROM task_table WHERE status = :taskStatus ORDER BY created_at DESC")
    Flowable<List<TaskEntity>> getAllTasks(String taskStatus);

    @Query("SELECT * FROM task_table WHERE id = :taskId")
    Flowable<TaskEntity> getTask(String taskId);

    @Update()
    int updateTask(TaskEntity updatedTask);

    @Query("SELECT COUNT(*) FROM task_table")
    int rowCount();
}

我正在尝试测试getTask()方法。这是失败的确切测试方法。

@Test
public void getTask_getSavedTask_returnsTask() {

    Long resp = mTaskDao.insertTask(taskEntity);
    assertThat(resp, is(1L));

    assertThat(mTaskDao.rowCount(), is(1));

    Flowable<TaskEntity> response = mTaskDao.getTask(taskEntity.getTaskId());
    TestSubscriber<TaskEntity> testSubscriber = new TestSubscriber<>();

    response.subscribe(testSubscriber);
    testSubscriber.assertNoErrors();
    testSubscriber.assertValueCount(1);
}

此代码段在testSubscriber.assertValueCount(1)方法失败。

模型正在保存在db中,因为insert call的返回值是&gt;行数也在增加。

我尝试从测试环境外部(从活动中)运行相同类型的代码,并且它在那里工作正常。

1 个答案:

答案 0 :(得分:1)

看起来您的DAO异步运行,TestSubscriber没有立即收到答案。将测试更改为此,它应该可以工作:

testSubscriber.awaitCount(1, BaseTestConsumer.TestWaitStrategy.SLEEP_1MS, 5000);

testSubscriber.assertNoTimeout();
testSubscriber.assertNoErrors();
testSubscriber.assertValueCount(1);