gpt4 book ai didi

kotlin - 单元测试Kotlin的ConflatedBroadcastChannel行为

转载 作者:行者123 更新时间:2023-12-02 12:53:01 25 4
gpt4 key购买 nike

在我目前正在从事的新项目中,我根本没有RxJava依赖项,因为直到现在我都不需要RxJava依赖项-协程很好地解决了线程问题。

在这一点上,我偶然发现了具有 BehaviorSubject 类似行为的要求,即可以订阅数据流并在订阅时接收最新值。据我了解, Channel 在Kotlin中提供了非常相似的行为,因此我决定尝试一下。

从我了解的this文章中, ConflatedBroadcastChannel 是模仿BehaviorSubject的 channel 类型,因此我声明以下内容:

class ChannelSender {

val channel = ConflatedBroadcastChannel<String>()

fun sendToChannel(someString: String) {
GlobalScope.launch(Dispatchers.Main) { channel.send(someString) }
}
}

为了收听 channel ,我这样做:

class ChannelListener(val channelSender: ChannelSender) {
fun listenToChannel() {
channelSender.channel.consumeEach { someString ->
if (someString == "A") foo.perform()
else bar.perform()
}
}
}

这可以按预期工作,但是在这一点上,我很难理解如何对 ChannelListener进行单元测试。

我试图找到与 here相关的东西,但是 example-channel-**.kt类都没有帮助。

与我的不正确假设有关的任何帮助,建议或纠正,都将不胜感激。谢谢。

最佳答案

使用help of Alexey,我可以设法获得以下代码,从而回答了这个问题:

class ChannelListenerTest {

private val val channelSender: ChannelSender = mock()

private val sut = ChannelListener(channelSender)
private val broadcastChannel = ConflatedBroadcastChannel<String>()

private val timeLimit = 1_000L
private val endMarker = "end"

@Test
fun `some description here`() = runBlocking {
whenever(channelSender.channel).thenReturn(broadcastChannel)

val sender = launch(Dispatchers.Default) {
broadcastChannel.offer("A")
yield()
}

val receiver = launch(Dispatchers.Default) {
while (isActive) {
val i = waitForEvent()
if (i == endMarker) break
yield()
}
}

try {
withTimeout(timeLimit) {
sut.listenToChannel()
sender.join()
broadcastChannel.offer(endMarker) // last event to signal receivers termination
receiver.join()
}
verify(foo).perform()
} catch (e: CancellationException) {
println("Test timed out $e")
}
}

private suspend fun waitForEvent(): String =
with(broadcastChannel.openSubscription()) {
val value = receive()
cancel()
value
}

}

关于kotlin - 单元测试Kotlin的ConflatedBroadcastChannel行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56848248/

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