Android 单元测试时未调用Rxjava 2 on error
单元测试时不调用Rxjava 2 on error。我将kotlin与RxJava2一起使用 方法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:响
@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)
}
}