WebFlux响应式编程Mono监听器doOnNext和doOnSuccess的作用很相似,都可以对收到的数据做出反应,但对于空Mono,两者的行为却完全不同。
Mono允许我们附加一个监听器doOnNext,该监听器将在数据发出时触发:
@Test
void givenAPaymentMono_whenCallingServiceOnNext_thenCallServiceWithPayment() {
Payment paymentOf100 = new Payment(100);
Mono paymentMono = Mono.just(paymentOf100);
paymentMono.doOnNext(paymentService::processPayment).block();
verify(paymentService).processPayment(paymentOf100);
}
但是如果是空的Mono,不会发出任何数据,并且不会触发doOnNext:
@Test
void givenAnEmptyMono_whenCallingServiceOnNext_thenDoNotCallService() {
Mono emptyMono = Mono.empty();
emptyMono.doOnNext(paymentService::processPayment).block();
verify(paymentService, never()).processPayment(any());
}
我们可以使用doOnSuccess附加一个侦听器,当Mono成功完成时将触发该侦听器。这次使用doOnSuccess重复测试:
@Test
void givenAPaymentMono_whenCallingServiceOnSuccess_thenCallServiceWithPayment() {
Payment paymentOf100 = new Payment(100);
Mono paymentMono = Mono.just(paymentOf100);
paymentMono.doOnSuccess(paymentService::processPayment).block();
verify(paymentService).processPayment(paymentOf100);
}
但是即使没有发出数据,Mono也被认为是成功完成的。因此,对于空的Mono,上面的代码将doOnSuccess仍然会被触发并传入空数据:
@Test
void givenAnEmptyMono_whenCallingServiceOnSuccess_thenCallServiceWithNull() {
Mono emptyMono = Mono.empty();
emptyMono.doOnSuccess(paymentService::processPayment).block();
verify(paymentService).processPayment(null);
}
通过测试用例对比了Mono的doOnNext和doOnSuccess监听器之间的区别:
页面更新:2024-05-14
本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828
© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号