2 回答
TA贡献1829条经验 获得超4个赞
好吧,经过更多的挖掘,并在朋友的帮助下,我成功地确定了任务的意图:
我应该在那里做的是:
Single<BigDecimal> summarizeConfirmedTransactions() throws SummarizationException {
Observable<Transaction> observableTransactions = transactions.get();
Observable<Confirmation> observableConfirmations = confirmations.get();
return Observable.zip(observableTransactions, observableConfirmations,
(t, c) -> new ConfirmableTransaction(c.isConfirmed, t.value))
.filter(confirmableTransaction -> confirmableTransaction.isConfirmed)
.map(t -> t.value)
.reduce(BigDecimal::add)
.toSingle()
.onErrorResumeNext(th -> Single.error(new SummarizationException(th.getMessage())));
}
TL:DR 我不应该将错误“包装”到引发的异常中,而是将它们包装到包含异常的错误响应中。
TA贡献1854条经验 获得超8个赞
处理此问题的一种方法是在测试中使用 try-catch 块,解开 CompositeException,然后断言捕获的异常。
fun testSummarizationException() {
try {
summarizeConfirmedTransactions()
} catch (ex: Exception) {
val customException = (ex as? CompositeException)?.exceptions?.get(0)
// assert to make sure thrown exception is of custom type
assert(customException is SummarizationException)
}
}
这是 CompositeException 被解包以获取自定义异常的地方。
val customException = (ex as?CompositeException)?.exceptions?.get(0)
如果允许,异常会被类型转换为 CompositeException。如果该类型不允许强制转换,则将返回 null 并导致测试失败。
添加回答
举报