Ich wollte einen Komponententest schreiben, der callInit
Methode unten bestätigen wird. Allerdings habe ich null Zeiger Ausnahme, wo die Zeile subscribe(
enthält. Meine Frage ist, wie überprüfe ich onnext und onerror Bedingungen in einer Methode wie unten?Test Scheduler funktioniert nicht (Kotlin + RxJava2 + Mockito)
override fun callInit() {
val requestInit = RequestInit(os = "android", osVersion = deviceUtil.osVersion(),
appVersion = deviceUtil.apiVersion())
compositeDisposable.add(
interactor.getInit(requestInit)
.subscribe(
{
view.hideProgress()
this.commercialLink = it.commercialLink
view.updateScreen()
},
{ error -> view.onError(error) }
)
)
}
Testmethode:
@Test
fun should_update_commerciallink_AND_updateScreen_when_callInit() {
val request = RequestInit("android", "version", "osversion")
val responseInit = ResponseInit(false, false,
"updatelink", "message", "useragreement", "commerciallink")
whenever(deviceUtil.osVersion()).thenReturn("version")
whenever(deviceUtil.apiVersion()).thenReturn("apiversion")
whenever(interactor.getInit(request)).thenReturn(Observable.just(responseInit))
presenter.callInit()
testScheduler.triggerActions()
verify(view).hideProgress()
verify(view).updateScreen()
}
EDIT
class SplashInteractor(private val initService: InitService,
private val schedulerProvider: SchedulerProvider) : SplashContract.Interactor {
override fun getInit(requestInit: SplashRequest.Init): Observable<SplashResponse.Init> {
return initService.init(requestInit)
.subscribeOn(schedulerProvider.io())
.flatMap(funcErrorCheckAndTransform())
.flatMap(funcVersionControl())
.observeOn(schedulerProvider.ui())
}
override fun downloadCommercialVideo(commercialLink: String): Observable<File> {
return initService.downloadCommercialLink(commercialLink)
.subscribeOn(schedulerProvider.io())
.flatMap(funcDownload(commercialLink))
.observeOn(schedulerProvider.ui())
}
}
Moderator Test
@Before
fun setUp() {
testScheduler = TestScheduler()
interactor = SplashInteractor(initService, TestSchedulerProvider(testScheduler))
presenter = SplashPresenter(contract, interactor, uriWrapper, compositeDisposable,
cache, fileUtil, deviceUtil)
spyPresenter = Mockito.spy(presenter)
}
Ich denke, das Problem ist in der letzten "wann immer" Anweisung, weil es die Bedingung überprüft, dass der 'request' Parameter übergeben wird. Sie sollten nur überprüfen, dass der Parameter ein 'RequestInit' ist, etwas wie' Mockito.isA (RequestInit.class) 'als Parameter. In java wäre es also: 'when (interactor.getInit (isA (RequestInit.class))). ThenReturn (Observable.just (responseInit))' – GVillani82
Können Sie zeigen, wie Sie 'TestScheduler' in Tests setzen? Und schaue auf deinen Code und testen Sie brauchen es nicht –