You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 02:48:16