2017-11-30 16 views
2

私は以下のcallInitメソッドを検証する単体テストを書いたかったのです。しかし、私はラインがsubscribe(を保持するnullポインタの例外があります。私の質問は、以下のような方法でonnextとonerrorの条件をどのように検証するのですか?TestSchedulerが機能しない(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) } 
      ) 
    ) 
} 

試験方法:

@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()) 
    } 
} 

プレゼンターテストあなたがwhenever文のいずれかでタイプミスを持って

@Before 
    fun setUp() { 
    testScheduler = TestScheduler() 
    interactor = SplashInteractor(initService, TestSchedulerProvider(testScheduler)) 

    presenter = SplashPresenter(contract, interactor, uriWrapper, compositeDisposable, 
     cache, fileUtil, deviceUtil) 
    spyPresenter = Mockito.spy(presenter) 

    } 
+0

問題は、 'requested'パラメータが渡されたという条件をチェックしているため、最後の' whenever'ステートメントにあると思います。パラメータが 'Mockito.isA(RequestInit.class)'のような 'RequestInit'であることをパラメータとしてチェックするだけでよいのです。 javaの場合、 '(interactor.getInit(isA(RequestInit.class)))thenReturn(Observable.just(responseInit))' – GVillani82

+0

テストで 'TestScheduler'をどのように設定するかを表示できますか?あなたのコードを見て、それを必要としないテスト –

答えて

2

 

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

あなたが「apiversion」を返すように指示しているが、実際のrequestを少し別の方法で宣言されています

 

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

これらの2つの文字列は、このようにMockitoは、そのあなたObservableを返すことができません、等しいではありません期待している。

"osversion"から"apiversion"に変更してください。

+3

私はそれが正しい答えだと思う:) –

+0

その近くでも、何か違うことがあります。私が理解しているように、インタラクタークラスを模擬しているわけではありません。 –

関連する問題