Android 为RxJava doOnSubscribe和doOnFinally情况编写测试用例

Android 为RxJava doOnSubscribe和doOnFinally情况编写测试用例,android,junit,mockito,rx-java,Android,Junit,Mockito,Rx Java,假设我在Kotlin中有一段特殊的代码。我的问题是如何在订阅期间进行测试我已将按钮的可见性设置为VISIBLE,并将文本设置为“”。一旦订阅完成,我就可以看到GONE并测试“DONE” 到目前为止,我的测试用例是这样的 @Test fun getInfo() { viewModel.getInfo() Assert.assertEquals(View.GONE, viewModel.buttonVisibility.get()) Assert.assertEquals(“

假设我在Kotlin中有一段特殊的代码。我的问题是如何在订阅期间进行测试我已将按钮的可见性设置为VISIBLE,并将文本设置为“”。一旦订阅完成,我就可以看到GONE并测试“DONE”

到目前为止,我的测试用例是这样的

@Test
fun getInfo() {
    viewModel.getInfo()
    Assert.assertEquals(View.GONE, viewModel.buttonVisibility.get())
    Assert.assertEquals(“DONE”, viewModel.buttonText.get())
}
当你看到最终状态时,这显然是正确的,但是我如何测试doOnSubscribe的中间阶段呢


如果按钮文本设置为“从“”完成”,并且可见性从可见变为消失,是否有一种断言方法

doOnSubscribe
only
只是您的
视图的状态
/
视图模型
,因此您可以提取这些状态并检查状态更改:

fun getInfo() {
    getInfoFromApi()
        .doOnSubscribe {
            view.setButtonVisible()
         }
        .onFinally {
            view.setButtonGone()
        }
        .subscribe {
            // Some other random stuff
        }
    }
}
然后验证呼叫:

@Test
fun getInfo() {
    val view = mock(View::class)
    viewModel.getInfo()
    verify(view, times(1)).setButtonVisible())
    verify(view, times(1)).setButtonGone())
}
顺便说一下,如果您的示例应该与
MVVM
一起使用,那么您的
ViewModel
不应该引用
视图<代码>视图模型
应为视图提供绑定。然后代码可能是这样的:

fun getInfo():Observable<State> {
    return concat(
       just(State.Progress), 
       getInfoFromApi().map(State.Result)
    ).onErrorResumeNext(just(State.Error))
}
fun getInfo():可观察{
返回海螺(
公正(国家进步),,
getInfoFromApi().map(State.Result)
).onErrorResumeNext(仅(State.Error))
}
然后测试变得更加抽象和清晰

@Test
fun getInfoSuccess() {
    //config api success behaviour
    TestObserver<State> observer = TestObserver.create();
    viewModel.getInfo().subscribe(observer)
    observer.assertResult(State.Progress, State.Result);
}

@Test
fun getInfoError() {
    //config api error behaviour
    TestObserver<State> observer = TestObserver.create();
    viewModel.getInfo().subscribe(observer)
    observer.assertResult(State.Progress, State.Error);
}
@测试
fun getInfoSuccess(){
//配置api成功行为
TestObserver=TestObserver.create();
viewModel.getInfo().subscribe(观察者)
observer.assertResult(State.Progress,State.Result);
}
@试验
fun getInfoError(){
//配置api错误行为
TestObserver=TestObserver.create();
viewModel.getInfo().subscribe(观察者)
observer.assertResult(State.Progress,State.Error);
}
@Test
fun getInfoSuccess() {
    //config api success behaviour
    TestObserver<State> observer = TestObserver.create();
    viewModel.getInfo().subscribe(observer)
    observer.assertResult(State.Progress, State.Result);
}

@Test
fun getInfoError() {
    //config api error behaviour
    TestObserver<State> observer = TestObserver.create();
    viewModel.getInfo().subscribe(observer)
    observer.assertResult(State.Progress, State.Error);
}