如何测试PublishSubject

时间:2018-11-01 10:20:19

标签: android unit-testing rx-java2

我正在尝试为上述示例编写单元测试。如何模拟和测试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动作?

1 个答案:

答案 0 :(得分:0)

目前还不清楚为什么在PublishSubject方法中有一个本地loadData(),而从外部无法访问它,因此无法以当前形式触发它。

您可以将其替换为具有初始值的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()
}