2017-11-30 6 views
2

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) 

    } 
+0

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

+0

Können Sie zeigen, wie Sie 'TestScheduler' in Tests setzen? Und schaue auf deinen Code und testen Sie brauchen es nicht –

Antwort

2

Sie an einer whenever Aussagen einen Tippfehler haben:

 

    whenever(deviceUtil.apiVersion()).thenReturn("apiversion") 
 

Sie haben angewiesen, zurückzukehren „APIVERSION“, aber die tatsächliche request ist etwas andere Art und Weise erklärt:

 

    val request = RequestInit(..., ..., "osversion") 
 

Diese beiden Zeichenfolge nicht gleich, so kann Mockito nicht die Observable zurückkehren, dass Sie erwarten.

Ändern Sie "osversion" zu "apiversion".

+3

Ich denke, es ist richtige Antwort :) –

+0

ist es nicht einmal in der Nähe, da ist etwas anderes. Es interagiert nicht mit der Klasse, wie ich es verstehe, oben habe ich die anderen notwendigen Codes angegeben. –