我正在尝试测试即使一个参数失败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()
可能存在其他错误。