2 回答

TA貢獻1829條經(jīng)驗 獲得超4個贊
好吧,經(jīng)過更多的挖掘,并在朋友的幫助下,我成功地確定了任務(wù)的意圖:
我應(yīng)該在那里做的是:
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 我不應(yīng)該將錯誤“包裝”到引發(fā)的異常中,而是將它們包裝到包含異常的錯誤響應(yīng)中。

TA貢獻1854條經(jīng)驗 獲得超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)
如果允許,異常會被類型轉(zhuǎn)換為 CompositeException。如果該類型不允許強制轉(zhuǎn)換,則將返回 null 并導致測試失敗。
添加回答
舉報