gpt4 book ai didi

android - Mockito 需要但未调用

转载 作者:行者123 更新时间:2023-11-28 21:25:58 25 4
gpt4 key购买 nike

我不熟悉编写测试和使用 Mockito。我已经在 Stackoverflow 上阅读了类似的主题并进行了建议的更改,确保相关的类/接口(interface)/方法是开放的。

I tried to follow this

模拟构造函数注入(inject)的依赖

这是我到目前为止想出的测试

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.

即使我在测试中没有提到那个方法,我也得到了这个回应。这是我的演示者注册方法。我已经将涉及的类/接口(interface)和方法更改为 open (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)

}

这是接口(interface)

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

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

感谢所有帮助。

最佳答案

如果您使用的是纯 jUnit,则您的 AndroidSchedulers.mainThread() 为空。这就是不调用 onNext 的原因。

您需要在 setUp() 方法中覆盖 Schedulers:

    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() 中注销调度程序,如下所示:

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

关于android - Mockito 需要但未调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40677481/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com