kotlin mockk没有回答发现错误

嗨,我试图嘲笑从单一的观察得到的回应,从改装使用我的演示者类调用的委托人返回,我得到以下错误:

io.mockk.MockKException:没有find答案:LoginPresenter(#1).login(LoginRequest(email=hello@gmail.com,password = password123))

这是我的测试代码

@Test fun testKotlinMock(){ val presenter : LoginPresenter = mockk() val delegator = mockk() val viewCallback = mockk() val cookieStore = mockk() val loginRequest = LoginRequest("hello@gmail.com", "password123") val customerResponse = CustomerResponse("jon", "richy") every { delegator.login(loginRequest) } returns Single.just(Response.success(any())) every { delegator.getCustomer() } returns Single.just(customerResponse) every { presenter.loginViewCallBack } returns viewCallback every { presenter.accountDelegator } returns delegator every { presenter.cookieStorage } returns cookieStore presenter.login(loginRequest) } 

我的实际Presenter代码如下所示:

  @Inject lateinit var loginViewCallBack: LoginViewCallBack @Inject lateinit var delegator: DelegatorContract @Inject lateinit var cookieStorage: CookieStore @Inject constructor() override fun login(loginRequest: LoginRequest) { delegator.login(loginRequest) .flatMap({ response -> saveCookieAndContinue(response) }) .observeOn(AndroidSchedulers.mainThread()) .subscribeOn(Schedulers.io()) .subscribe(object : SingleObserver{ override fun onSubscribe(d: Disposable) { } override fun onError(e: Throwable) { loginViewCallBack.onErrorLogin(PianoError.ERROR_LOGIN_INVALID) Log.d("JJJ", "login error") } override fun onSuccess(customerResponse : CustomerResponse) { loginViewCallBack.onLoginSuccess(customerResponse) Log.d("JJJ", "login successfully") } }) } private fun saveCookieAndContinue(response: Response): Single { if (response.isSuccessful) { val headers = response.headers() cookieStorage.saveSessionCookies(headers.get(PianoCookieStore.COOKIE_HEADER_SET_NAME)!!) return accountDelegator.getCustomer() } //TODO: Change this to throw a login exception? throw RuntimeException() } 

我基本上想嘲笑从主代码中看到注入的依赖关系,然后运行一个快乐的路径unit testing。

当我调用presenter.login(loginRequest)与没有答案发现错误时失败

这是我使用的kotlin扩展插件http://mockk.io/

在你的情况下,你嘲笑正在测试的类。 你有两个选择:

  • 摆脱loginPresenter mockk,只需使用原始对象和设置属性
  • 使用spyk来创建间谍。 这是原始对象和模拟之间的东西

抛出exception是因为mock默认是严格的,它只是不知道如何处理它,因为嘲笑作为对象根本没有初始化。

阅读更多关于嘲笑,间谍和放松的嘲笑在这里: https : //blog.kotlin-academy.com/mocking-is-not-rocket-science-mockk-features-e5d55d735a98