2016-11-18 13 views
0

私はテストを書くこととMockitoを使うのが初めてです。 私はここでStackoverflowに関する似たような話題を読んで、提案された変更を加えました。クラス/インターフェース/メソッドが公開されていることを確認しました。Mockito募集していますが、呼び出されていません

I tried to follow this

モックコンストラクタを注入依存関係

これは私がこれまで

class RegistrationPresenterTest { 
@Test 
fun testRegisterSuccess() { 
    val mockService = mock<IHerokuInteractor>() 
    val mockLocal = mock<ILocalStorageInteractor>() 
    val mockView = mock<RegisterView>() 
    val mockRegistrationResponse = HerokuRegisterResponse("hash") 
    val mockPair = ImeiPair("imei","hash") 
    val presenter = RegisterPresenterImpl(mockLocal,mockService) 

    whenever(mockService.register(any())).thenReturn(Observable.just(mockRegistrationResponse)) 
    whenever(mockLocal.clearPreferences()).thenReturn(Observable.just(true)) 
    whenever(mockLocal.putImeiPair(any())).thenReturn(Observable.just(true)) 
    //whenever(presenter.writeImeiPairLocally(any())) How do I specify parameters since it uses a parameter from the register method? 

    presenter.bindView(mockView) 
    presenter.register("imei","male") 

    verify(mockService, times(1)).register(any()) 
    verify(mockLocal,times(1)).clearPreferences() 
    verify(mockLocal,times(1)).putImeiPair(any()) 
    verify(mockView,times(1)).moveToMain() 
} 

が、私は入れません応答が

Wanted but not invoked: 
registerPresenterImpl.writeImeiPairLocally(
<any com.company.appname.model.ImeiPair> 
); 

Actually, there were zero interactions with this mock. 
で思い付いたテストがあります

私はテストでその方法について言及していないときでも私はこの応答を得た。 これは私のプレゼンターの登録方法です。私はクラス/インターフェイスを変更しました&メソッドを開く(kotlin)に関与。私はオーバライドメソッドが本質的にkotlinで開いていると信じています。

open class RegisterPresenterImpl @Inject constructor(val localStorage : ILocalStorageInteractor, var herokuService : IHerokuInteractor) 

override fun register(imei : String, gender : String){ 
    subscription = herokuService.register(RegisterObject(imei,gender)).subscribeOn(Schedulers.io()) 
      .observeOn(AndroidSchedulers.mainThread()).subscribe(
      { 
       registrationResult -> 
       Log.d(TAG,"${registrationResult}") 
       if(registrationResult.imei_hash != null){ 
        writeImeiPairLocally(ImeiPair(imei,registrationResult.imei_hash)) 
       } 
       else{ 
        Log.e(TAG,"User already exists") 
       } 
      }, 
      { 
       errorResponse -> Log.e(TAG,"Could not register user ${errorResponse.message}") 
      } 
    ) 
    addSubscription(subscription) 
} 

と同様にここ

open fun writeImeiPairLocally(pair : ImeiPair){ 
    subscription = localStorage.clearPreferences().flatMap { 
     cleared -> localStorage.putImeiPair(pair)}.subscribeOn(Schedulers.io()) 
      .observeOn(AndroidSchedulers.mainThread()).subscribe(
      { 

       booleanResult -> view?.moveToMain() 
      }, 
      { 
       errorResponse -> Log.e(TAG,"Could not write ImeiPair to SharedPreferences ${errorResponse.message}") 
      } 
    ) 
    addSubscription(subscription) 

} 

は、すべてのヘルプが理解されるインターフェース

open interface ILocalStorageInteractor : ILocalStorage{ 
    fun getImeiPair() : Observable<ImeiPair> 
    fun putImeiPair(pair: ImeiPair) : Observable<Boolean> 
} 

open interface ILocalStorage { 
    fun clearPreferences() : Observable<Boolean> 
} 

あります。

答えて

1

プレーンjUnitを使用している場合、AndroidSchedulers.mainThread()はnullです。そのため、onNextは呼び出されません。あなたが使用しようとしている場合

RxJavaHooks.setOnIOScheduler(scheduler1 -> Schedulers.immediate()); 

:あなたがしてsetUp()方法でスケジューラをオーバーライドする必要が

:テストでの同時実行を避けるために

RxAndroidPlugins.getInstance().registerSchedulersHook(new RxAndroidSchedulersHook() { 
     @Override 
     public Scheduler getMainThreadScheduler() { 
      return Schedulers.immediate(); // or .test() 
     } 
    }); 

は、私はこのようなSchedulers.io()をオーバーライドすることをお勧めしますTestSchedulerTestScheduler.triggerActions()メソッドを呼び出すことを忘れないでください。

また、このようなtearDown()でスケジューラの登録を解除することを忘れないでください:

RxJavaHooks.reset(); 
    RxAndroidPlugins.getInstance().reset(); 
    AndroidSchedulers.reset(); 
    Schedulers.reset(); 
+0

が応答をいただき、ありがとうございます。 BeforeメソッドsetUp()とAfter tearDown()の最後のブロックに最初の2ブロックのコードを追加しましたが、同じ応答が得られます。これは提案された変更を実装する正しい方法でしたか?私は前にテストをしたことがない。 – buddhabath

+0

'register(imei:String、gender:String)'関数からonNext呼び出しの中でデバッガを使用しようとしましたか? –

+0

テストを動かした後(インストゥルメントテスト中)、代わりに同じエラーが表示されますが、clearPreferences()の場合、元の投稿の一番下を確認してください。最初は、私の発表者のLogging()を黙らせないことに苦情を言いました – buddhabath

関連する問題