Android 单元测试时未调用Rxjava 2 on error

Android 单元测试时未调用Rxjava 2 on error,android,kotlin,junit,Android,Kotlin,Junit,单元测试时不调用Rxjava 2 on error。我将kotlin与RxJava2一起使用 方法 @SuppressLint(“检查结果”) 覆盖有趣的电影(){ view.showLoader(true) 一次性=getInstance(false).create(API::class.java) .电影 .subscribeOn(io) .观测(主) .subscribowith(对象:DisposableObserver(){ 覆盖有趣的onComplete(){ } 覆盖下一步(t:响

单元测试时不调用Rxjava 2 on error。我将kotlin与RxJava2一起使用

方法

@SuppressLint(“检查结果”)
覆盖有趣的电影(){
view.showLoader(true)
一次性=getInstance(false).create(API::class.java)
.电影
.subscribeOn(io)
.观测(主)
.subscribowith(对象:DisposableObserver(){
覆盖有趣的onComplete(){
}
覆盖下一步(t:响应){
println(t)
view.setAdapter(t?.results作为列表)
view.showLoader(错误)
}
覆盖有趣的错误(e:可丢弃){
e、 printStackTrace()
view.showLoader(错误)
view.batherRor(e.message.toString())}
})
}
试验

@测试
fun fetchInvalidDataShouldThrowError(){
`当`(api.fetchFilms()).thenReturn(Observable.error(IOException())时)
filmsPresenter.fetchFilms()
val subscriber=TestSubscriber()
订户等待终端事件(5,时间单位秒)
验证(filmsView,times(1)).showLoader(真)
验证(电影视图)。淋浴ROR(“t”)
验证(filmsView).显示加载程序(false)
}

您实际上在这里创建了两个
API

每次调用presenter上的
fetchFilms()
,都会创建一个新的API。您不能以这种方式模拟
API


修复它的最佳方法是将
API
对象作为方法参数传递给演示者中的
fetchFilms()
。通过这种方式,您可以决定在此处提供真实的
API
或模拟的您实际创建的两个
API

每次调用presenter上的
fetchFilms()
,都会创建一个新的API。您不能以这种方式模拟
API


修复它的最佳方法是将
API
对象作为方法参数传递给演示者中的
fetchFilms()
。通过这种方式,您可以决定提供一个真正的
API
或一个模拟API

似乎您也在测试中异步运行代码

您必须同步以前使用的调度程序

@Before
fun setupSchedulers() {
    RxAndroidPlugins.setMainThreadSchedulerHandler { Schedulers.trampoline() }
    RxJavaPlugins.setIoSchedulerHandler { Schedulers.trampoline() }
}

@Test
fun  fetchInvalidDataShouldThrowError() {
    `when`(api.fetchFilms()).thenReturn(Observable.error(IOException("t")))
    filmsPresenter.fetchFilms()

    verify(filmsView).showLoader(true)
    verify(filmsView).showError("t")
    verify(filmsView).showLoader(false)
}

看起来您也在测试中异步运行代码

您必须同步以前使用的调度程序

@Before
fun setupSchedulers() {
    RxAndroidPlugins.setMainThreadSchedulerHandler { Schedulers.trampoline() }
    RxJavaPlugins.setIoSchedulerHandler { Schedulers.trampoline() }
}

@Test
fun  fetchInvalidDataShouldThrowError() {
    `when`(api.fetchFilms()).thenReturn(Observable.error(IOException("t")))
    filmsPresenter.fetchFilms()

    verify(filmsView).showLoader(true)
    verify(filmsView).showError("t")
    verify(filmsView).showLoader(false)
}

我必须将repo传递给演示者,以获得相同的实例API

这里是我必须做的一些改变

方法


我必须将repo传递给演示者,以获得相同的实例API

这里是我必须做的一些改变

方法


OneError没有被调用,因为成功测试工作正常。我得到了这个“想要但没有调用:”验证错误(filmsView)。淋浴错误(“t”)像这样@Before fun setup(){RxAndroidPlugins.setInitMainThreadSchedulerHandler{scheduler->Schedulers.trampoline()}RxJavaPlugins.setIoSchedulerHandler{t->Schedulers.trampoline()}它看起来像是
filmsPresenter
有属性
io
main
。你能添加初始化它的方式吗?根据它的不同,甚至可能不需要设置插件…OneRor没有被调用,因为成功测试很好。我得到了这个“想要但没有被调用”:验证错误(filmsView).bathror(“t”)类似于@Before fun setup(){RxAndroidPlugins.setInitMainThreadSchedulerHandler{scheduler->Schedulers.trampoline()}RxJavaPlugins.setIoSchedulerHandler{t->Schedulers.trampoline()}它看起来像是
filmsPresenter
具有属性
io
main
。您可以添加如何初始化它吗?根据它的不同,甚至可能不需要设置插件。。。
@Before
fun setupSchedulers() {
    RxAndroidPlugins.setMainThreadSchedulerHandler { Schedulers.trampoline() }
    RxJavaPlugins.setIoSchedulerHandler { Schedulers.trampoline() }
}

@Test
fun  fetchInvalidDataShouldThrowError() {
    `when`(api.fetchFilms()).thenReturn(Observable.error(IOException("t")))
    filmsPresenter.fetchFilms()

    verify(filmsView).showLoader(true)
    verify(filmsView).showError("t")
    verify(filmsView).showLoader(false)
}
class RepoTest(val api : API) {
    fun filmm() : Observable<Response> {
        return api.fetchFilms()
    }
}
class FlimsPresenter(private val view: GetFlimsContract.View,  repo: RepoTest) : GetFlimsContract.Presenter
 override fun fetchFilms() {
        view.showLoader(true)
        disposable = repot.filmm()
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribeWith(object : DisposableObserver<Response>() {
                    override fun onComplete() {
                    }

                    override fun onNext(t: Response) {
                        println(t)
                        view.setAdapter(t?.results as List<ResultsItem>)
                        if (t?.results.isEmpty()) view.showEmptyView(true)
                        else view.showEmptyView(false)
                        view.showLoader(false)
                    }

                    override fun onError(e: Throwable) {
                        e.printStackTrace()
                        view.showLoader(false)
                        view.showError(e.message.toString())
                    }

                })


    }
class TestSample {
    @Mock
    private lateinit var filmsPresenter: GetFlimsContract.Presenter


    @Mock
    private lateinit var filmsView: GetFlimsContract.View


    private lateinit var api: API
    @Mock
    private lateinit var disposable: Disposable
    @Mock
    lateinit var repoTest: RepoTest

    @Before
    fun setup() {
        RxAndroidPlugins.setMainThreadSchedulerHandler { scheduler -> Schedulers.trampoline() }
        RxAndroidPlugins.setInitMainThreadSchedulerHandler { scheduler -> Schedulers.trampoline() }
        RxJavaPlugins.setIoSchedulerHandler { t -> Schedulers.trampoline() }
        MockitoAnnotations.initMocks(this)

        repoTest = Mockito.mock(RepoTest::class.java)

        filmsView = Mockito.mock(GetFlimsContract.View ::class.java)

        filmsPresenter = FlimsPresenter(filmsView,repoTest )
    }


    @Test
    fun `should lod item into views`() {

        Mockito.`when`(repoTest.filmm()).thenReturn(Observable.just(Response("","",7, listOf(ResultsItem()))))
        filmsPresenter.fetchFilms()

        Mockito.verify(filmsView).showLoader(true)
        Mockito.verify(filmsView).setAdapter(anyList())
        Mockito.verify(filmsView).showLoader(false)
    }


    @Test
    fun `should show error if network call fails`(){

        Mockito.`when`(repoTest.filmm()).thenReturn(Observable.error(Exception("t")))
        filmsPresenter.fetchFilms()
        Mockito.verify(filmsView).showLoader(true)
        Mockito.verify(filmsView).showError("t")
        Mockito.verify(filmsView).showLoader(false)
    }
}