当前位置: 首页 > 知识库问答 >
问题:

Mockito被通缉但未被调用

公羊渝
2023-03-14

我是写测试和使用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.

即使我在测试中没有提到这种方法,我也得到了这种反应。这是我的演示者注册方法。我已经改变了类/接口

 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个答案

东郭子默
2023-03-14

如果您使用的是普通的jUnit,那么您的Androidchedulers.mainThread()为空。这就是为什么onNext不被称为。

您需要在setUp()方法中使用以下内容覆盖调度程序:

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

为了避免测试中的并发,我建议重写调度器。io()如下所示:

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

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

也不要忘记像这样在tearDown()中注销Schedulers:

    RxJavaHooks.reset();
    RxAndroidPlugins.getInstance().reset();
    AndroidSchedulers.reset();
    Schedulers.reset();
 类似资料:
  • 我有如下测试方法: 是我要模拟并返回空映射的方法。但我收到的失败信息说 需要但未调用MyClass.MethodUsedInMethodBeingTest() .

  • 我有个问题。我用mockito创建对象。然后我对方法进行验证,当运行测试时,它给我的错误是Wanted但not invived。并且服务保持为()。 test不是按照verify运行的,没有调用Wanted buy。

  • 我在试着重构一些声纳上的假设。在重构之前,代码如下所示: 所以我把这些方法添加到一个映射中,并像这样调用它 我没有修改测试类中的任何内容,但我得到了以下错误: 被通缉但未被援引: - 但是揭穿它,它实际上是有效的,断言是正确的。原因可能是什么?

  • 我正在寻找一种方法来验证Mockito,在测试期间没有与给定的模拟进行任何交互。对于具有验证模式的给定方法,很容易实现这一点,但是我还没有找到完整模拟的解决方案。 我真正想要实现的是:在测试中验证,控制台上没有打印任何get。jUnit的总体思路如下: 一个有很多方法,我真的不想用单独的verify来验证每一个方法,对于。。。 所以我希望,如果有一个简单的解决方案,鉴于我有一个良好的测试覆盖率,我

  • 问题内容: 我有一个非常简单的Servlet和一个非常简单的HttpSessionListener: 我的方法从未被调用(没有日志输出),最终我在调用getSession()的那一行上得到一个 我尝试拨打电话时也没有问题,但存在相同的问题。 我不明白- 注释不足以调用我的侦听器吗?Eclipse甚至在下方将其显示为侦听器。 问题答案: 原来这是愚蠢的Eclipse问题之一… Project-> C

  • 我正在为Angular7模板中的函数编写单元测试用例。它是一个登录组件,登录功能在http请求中具有router.navigate,以便在正确登录时路由到仪表板。但是我得到了错误 - 错误:应使用[['/ProjectData/MasterSequence']]调用spy navigate,但从未调用过。堆叠(http://localhost:9876/absolute/home/hp/Downl