首页 > 解决方案 > 如何测试 PublishSubject

问题描述

我正在尝试为上面的示例编写单元测试。如何模拟和测试 PublishSubject 返回结果

我有一个发布主题

    fun loadData() {
        val publishSubject = PublishSubject.create<Boolean>()

        publishSubject.subscribe { 
            if(it) {
                view.onSuccess()
            } else {
                view.onError()
            }
        }

        useCase.loadDataFromServer(publishSubject)
    }

    @Test
    fun load_Data_From_Server_Success_Test() {             
        presenter.loadData()
        verify(view).onSuccess()
    }

但是 onSuccess 方法不会调用(如何使用 Mockito 或 PowerMockito 模拟 onNext 操作?

标签: androidunit-testingrx-java2

解决方案


目前尚不清楚为什么您PublishSubjectloadData()方法中有一个本地无法从外部访问,因此无法以其当前形式触发。

您可以将其替换为具有BehaviorSubject初始值的值:

fun loadData() {
    val subject = BehaviorSubject.createDefault(true) // <----------------

    subject.subscribe { 
        if(it) {
            view.onSuccess()
        } else {
            view.onError()
        }
    }

    useCase.loadDataFromServer(subject)
}

@Test
fun load_Data_From_Server_Success_Test() {             
    presenter.loadData()
    verify(view).onSuccess()
}

或在字段中公开主题并onNext从测试方法中调用它

val subject = PublishSubject.create();

fun loadData() {

    subject.subscribe { 
        if(it) {
            view.onSuccess()
        } else {
            view.onError()
        }
    }

    useCase.loadDataFromServer(subject)
}

@Test
fun load_Data_From_Server_Success_Test() {             
    presenter.loadData()
    subject.onNext(true)    // <-----------------------------------------
    verify(view).onSuccess()
}

推荐阅读