我正在尝试测试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"));
答案 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()
中可能存在其他错误。