我有以下函数public Mono<Integer> revertChange() { someService.someMethod() .retryWhen(3 times, with 150millis of delay, if specific error occured) .onError(e -> log_the_error); }
我有一个简单的单元测试,用来验证someService.someMethod被调用了3次`类测试{
@InjectMocks
SomeService someService;
@Test
void shouldCallSomeServiceExactlythreetimes_whenErrorOccured() {
verify(someService).someMethod(3)//someMethod invoked 3 times
}
}`
问题是验证块没有捕捉到someMethod
被执行了3次,它只表示执行了1次。我正在使用junit 5和jmockit,也许有更好的替代品专门用于反应性模拟,有什么想法吗?
验证块未捕获方法的多次执行
Mockito.verify(someService, Mockito.times(3)).someMethod();
来自https://javadoc.io/doc/org.mockito/mockito-core/latest/org/mockito/Mockito.html:
传递的参数使用equals((方法进行比较。阅读ArgumentCaptor或ArgumentMatcher,了解匹配/断言传递的参数的其他方法。
尽管可以验证存根调用,但通常它只是多余的。假设你已经截尾了foo.bar((。如果你的代码关心foo.bar(返回什么,那么其他东西就会中断(通常在执行verify((之前(。如果您的代码不关心foo.bar((返回什么,那么就不应该对其进行存根处理。
同时检查https://javadoc.io/doc/org.mockito/mockito-core/latest/org/mockito/Mockito.html#4
用于超时检查的验证https://javadoc.io/doc/org.mockito/mockito-core/latest/org/mockito/Mockito.html#verification_timeout
只要someMethod((在150毫秒内被调用2次,该代码段就会通过Mockito.verify(someService, Mockito.timeout(150).times(2)).someMethod();
在仔细调查问题并深入研究反应堆内部构件项目后,解决方案看起来非常简单——我调用的方法需要用Mono.deffer(() -> someService.someMethod())
包装,每次调用时都会热切地使用它