gpt4 book ai didi

android - 如何测试 Kotlin Coroutine actors

转载 作者:行者123 更新时间:2023-12-02 12:57:58 27 4
gpt4 key购买 nike

我已经在官方 kotlinx.coroutines docs 中实现了一个 actor .现在我必须在我的仪器测试中测试它们,但我总是得到

IllegalStateException: This job has not completed yet

这是我的测试代码:

@RunWith(AndroidJUnit4::class)
@ExperimentalCoroutinesApi
class ExampleInstrumentedTest {

@Test
fun testIncrease() = runBlockingTest {
val counter = Counter()
for (i in 0..10) {
counter.increase()
}
}

@Test
fun testException() = runBlockingTest {
val counter = Counter()
try {
for (i in 0..11) {
counter.increase()
}
Assert.fail()
} catch (e: Exception) {
// All good if the exception was thrown
}
}
}

这是 Actor :

sealed class CounterMsg
object IncCounter : CounterMsg()
class GetCounter(val response: CompletableDeferred<Int>) : CounterMsg()

class CounterActor {
private val actor = GlobalScope.actor<CounterMsg> {
var counter = 0
for (msg in channel) {
when (msg) {
is IncCounter -> if (counter < 10) counter++ else throw RuntimeException()
is GetCounter -> msg.response.complete(counter)
}
}
}

suspend fun send(message: CounterMsg) = actor.send(message)
}

class Counter {
private val actor = CounterActor()
suspend fun increase() = actor.send(IncCounter)
}

我的依赖项:

implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.3.40"
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-jdk8:1.3.0-M1"
androidTestImplementation "androidx.test.ext:junit:1.1.1"
androidTestImplementation "androidx.test:runner:1.2.0"
androidTestImplementation "org.jetbrains.kotlin:kotlin-test:1.3.40"
androidTestImplementation "org.jetbrains.kotlinx:kotlinx-coroutines-test:1.3.0-M1"

我已经试过了 GlobalScope.actor<CounterMsg>(Dispatchers.Unconfined)这至少会将第一个测试变为绿色,但异常测试仍然失败。

最佳答案

显然,它正在做一些小的改变:

  • 使用 cancel() 而不是在 actor 中抛出异常
  • 使用runBlocking 代替runBlockingTest

关于android - 如何测试 Kotlin Coroutine actors,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56801937/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com