RxJava - 测试 Single.zip() 以确保执行所有参数



我正在尝试测试即使一个参数失败Single.zip(...)也会调用每个参数,但是有时verify会失败,因为测试在Single.zip之前已经完成执行......

我觉得await基本上应该阻止,但情况似乎并不总是如此。我错过了什么?

法典:

public Completable execute(String id) {
    return doThing()
        .flatMap(result -> Single.zip(
            employeeService.getEmployee(id),
            databaseService.getData(id),
            (employee, data) -> ...
         ))
         .toCompletable();
}

测试:

@Test
public void test() {
    Exception ex = new Exception("err");
    when(employeeService.getEmployee(anyString()).thenReturn(Single.error(ex));
    myObject.execute("id")
     .test()
     .await()
     .assertFailure(e -> e.equals(ex);
    verify(employeeService).getEmployee(eq("id"));
    verify(databaseService).getData(eq("id"));
}

可能的解决方案

  verify(employeeService, atLeast(0)).getEmployee(eq("id"));
  verify(employeeService, atMost(1)).getEmployee(eq("id"));
  verify(databaseService, atLeast(0)).getData(eq("id"));
  verify(databaseService, atMost(1)).getData(eq("id"));

我正在尝试测试 Single.zip(...( 调用每个参数,即使一个参数失败,但有时验证会失败,因为测试在 Single.zip 之前完成执行......

这很难相信。我认为您的测试由于其他原因而失败。

Single.zip(
        employeeService.getEmployee(id),
        databaseService.getData(id),
        (employee, data) -> ...

当这里调用Single.zip()时,甚至在控制进入Single.zip()之前,就会调用employeeService.getEmployee(id)databaseService.getData(id)

甚至在控件进入该方法之前,首先计算方法调用的参数。因此,无论Single.zip()做什么,这两种方法都将被调用。

我认为您的测试失败了,因为doThing()可能存在其他错误。

相关内容

  • 没有找到相关文章

最新更新