RxJava条件合并操作异常断言失败问题排查
问题原因分析
你的代码核心问题在于RxJava的Observable操作符是不可变的:调用result.mergeWith(...)时,只会返回一个包含合并逻辑的新Observable实例,但你没有将这个新实例重新赋值给result变量。最终返回的始终是初始的Observable.just(null)——这个流只会发射一个null值然后正常完成,自然不会触发错误断言。
修复方案
方案一:修正赋值逻辑
每次调用mergeWith后,将返回的新Observable重新赋值给result,确保所有验证逻辑被合并到最终流中:
public Observable<Void> performValidation(SomeObject obj) { // 用empty()替代just(null),避免不必要的null值发射 Observable<Void> result = Observable.empty(); if (obj.getId() != null) { result = result.mergeWith(Observable.error(new RuntimeException("Validation 1 Fails"))); } if (obj.getName() != null) { result = result.mergeWith(Observable.error(new IllegalArgumentException("Validation 2 Fails"))); } return result; }
方案二:收集验证流后合并(更简洁)
先收集所有需要触发的错误流,再一次性合并,逻辑更清晰:
public Observable<Void> performValidation(SomeObject obj) { List<Observable<Void>> validations = new ArrayList<>(); if (obj.getId() != null) { validations.add(Observable.error(new RuntimeException("Validation 1 Fails"))); } if (obj.getName() != null) { validations.add(Observable.error(new IllegalArgumentException("Validation 2 Fails"))); } return Observable.merge(validations); }
说明
- 替换
Observable.just(null)为Observable.empty():你的需求是验证失败时抛出错误,不需要发射任何有效值,empty()流只会正常完成(无值发射),更符合验证场景的预期。 - 修复后,当传入id非空的
SomeObject实例时,流会正确发射RuntimeException,你的测试断言assertError(RuntimeException.class)就能正常通过。
内容的提问来源于stack exchange,提问作者Kamil W
相关产品推荐
相关产品推荐

