如何在android中模拟Kotlin对象?

问题描述 投票:3回答:1

我在kotlin中有一个控制当前用户会话信息的对象。我想模拟一个有回调的登录方法。

在测试时,我需要在SessionController对象中模拟这个方法。

object SessionController {

...

    fun signIn(username: String, password: String, signInCallBack: SignInCallBack) {
        sessionApi.attemptSignIn(username,password,object: SignInCallBack{
            override fun onSignInComplete() {
                signInCallBack.onSignInComplete()
            }

            override fun onErrorOccurred(errorCode: Int, errorMessage: String) {
                signInCallBack.onErrorOccurred(errorCode)
            }

        })
    }
    ....
}

AndroidTest是这样的:

@RunWith(AndroidJUnit4::class)
class LoginActivityTest {
  @Test
    fun loginErrorShowing() {
        test.tapUsernameField()
        test.inputTextinUsernameField("wrongusername")
        test.pressUsernameFieldIMEAction()
        test.inputTextinPasswordField("randomPassword")
        test.pressPasswordFieldIMEAction()

        Espresso.onView(ViewMatchers.withId(R.id.errorText)).check(ViewAssertions.matches(withText("Wrong Password")))
    }
}

关于如何实现这一点的任何建议/想法?我在线阅读使用Mockk作为kotlin但是无法模拟这个方法并调用适当的回调。任何改善结构的建议也将受到赞赏。

谢谢

android testing kotlin
1个回答
2
投票

在我看来,你应该让SessionController实现一个接口。

object SessionController: ISessionController {
    override fun signIn(username: String, password: String, signInCallBack: SignInCallBack) {
       (...)        
    }
}

interface ISessionController {
    fun fun signIn(username: String, password: String, signInCallBack: SignInCallBack)
}

这将为您提供很多解决问题的可能性,例如:

  • 依赖注入
  • 测试产品风味
  • 在测试代​​码中创建简单的mock()

由于你没有发布任何UT代码,所以给你非常严格的答案有点困难;)


编辑

在一篇文章中很难涵盖如此嘲弄这样一个大话题;)以下是一些很棒的文章:

创建单元测试你总是可以做到简单:

presenter.sth = mockk<ISessionController>()
© www.soinside.com 2019 - 2024. All rights reserved.