В новом проекте, над которым я сейчас работаю, у меня вообще нет зависимости от RxJava, потому что до сих пор мне это не нужно - сопрограммы решают проблему многопоточности довольно изящно.
В этот момент я наткнулся на требование иметь поведение, подобное BehaviorSubject
, при котором можно подписаться на поток данных и получить последнее значение при подписке. Как я узнал, Channel
обеспечивают очень похожее поведение в Kotlin, поэтому я решил попробовать их.
Из этой статьи, которую я узнал, ConflatedBroadcastChannel
- это тип канала, который имитирует BehaviorSubject
, поэтому я объявил следующее:
class ChannelSender {
val channel = ConflatedBroadcastChannel<String>()
fun sendToChannel(someString: String) {
GlobalScope.launch(Dispatchers.Main) { channel.send(someString) }
}
}
Для прослушивания канала я делаю это:
class ChannelListener(val channelSender: ChannelSender) {
fun listenToChannel() {
channelSender.channel.consumeEach { someString ->
if (someString == "A") foo.perform()
else bar.perform()
}
}
}
Это работает, как и ожидалось, но на данный момент у меня возникают трудности с пониманием того, как выполнить модульное тестирование ChannelListener
.
Я пытался найти что-то связанное здесь , но ни один из example-channel-**.kt
классов не помог.
Любая помощь, предложение или исправление, связанные с моими неверными предположениями, приветствуется. Спасибо.