WebFlux响应式编程Mono监听器doOnNext和doOnSuccess的区别

概述

WebFlux响应式编程Mono监听器doOnNext和doOnSuccess的作用很相似,都可以对收到的数据做出反应,但对于空Mono,两者的行为却完全不同。

doOnNext

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

我们可以使用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

标签:监听器   侦听器   区别   结论   作用   代码   测试   方法   数据

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top