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

时间:2018-04-19 10:27:59

标签: java junit mockito rx-java rx-java2

我正在尝试测试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"));

1 个答案:

答案 0 :(得分:1)

  

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

这很难相信。我认为你的考试因其他原因而失败。

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

在此处调用Single.zip()时,即使在控件进入employeeService.getEmployee(id)之前,也会调用databaseService.getData(id)Single.zip()

即使在控件进入该方法之前,也会首先计算方法调用的参数。因此无论Single.zip()是什么,都会调用这些方法。

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