Mockito通缉,但没有调用

我是新手写测试和使用Mockito。 我已经阅读了Stackoverflow中的类似主题,并进行了建议的更改,确保所考虑的类/接口/方法处于打开状态。

我试图遵循这一点

嘲笑构造函数注入依赖

这是我到目前为止的测试

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> } 

所有的帮助表示赞赏。

如果你使用普通的jUnit,那么你的AndroidSchedulers.mainThread()是null。 这就是为什么onNext没有被调用。

您需要使用setUp()方法覆盖调度程序:

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

为了避免测试中的并发性,我建议像这样重写Schedulers.io()

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

如果您要使用TestScheduler ,请不要忘记调用TestScheduler.triggerActions()方法。

另外不要忘记在tearDown()这样的注销Scheduler:

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