我想在這樣的掛起函式中覆寫while回圈之后的拋出線
suspend fun doWork(): Result<Any> {
while(isActive) {
/* ... do something */
return something
}
throw Exception("...")
}
這是真實代碼的通用概念,我嘗試了兩件事來解決問題:
- 創建一個假作業,但是當我實作作業介面時,我發現了一些 @InternalCoroutinesApi 注釋,所以如果不可能,請通過這種方式
- 像這樣在測驗函式中創建一個內部協程
@Test(expected = Exception::class)
fun `test when job is not active`() = coroutineDispatcher.runBlockingTest {
launch(coroutineContext) {
cancel()
val sut = doWork()
}
}
但是最后一個給了我一個誤報,而 Jacoco 并沒有接受它。有什么想法或建議嗎?
uj5u.com熱心網友回復:
這不是一個真正的答案,但很有可能你根本不需要isActive。
您可以只使用while(true)并忘記throw回圈之后。如果您在回圈中有掛起函式呼叫,它們可能會自行檢測到取消。如果沒有,您可以yield()添加一些暫停點。
請注意,isActive只有在當前協程背景關系有 aJob時才能正常作業,但情況可能并非總是如此(suspend fun main沒有作業,也沒有GlobalScope)。CoroutineContext.isActive這就是我建議棄用并打開此問題的原因之一。
uj5u.com熱心網友回復:
我得到了解決方案。點二以創建內部協程并取消它可以獲取帶有 false 值的 isActive
@Test(expected = Exception::class)
fun `test when job is not active`() = coroutineDispatcher.runBlockingTest {
launch(coroutineContext) {
cancel()
val sut = doWork()
}
}
獲得解決方案和正確覆寫的真正線索是將 JaCoCo 版本設定為 Gradle 中的最后一個
jacoco {
toolVersion = "0.8.8"
}
就這樣。感謝大家試圖幫助我。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/488721.html
