我在 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")))
}
}
关于如何实现这一目标有什么建议/想法吗?我已经在网上阅读了如何在 kotlin 中使用 Mockk,但无法模拟此方法并调用适当的回调。任何有关改进结构的建议也将不胜感激。
Thanks
在我看来,你应该让 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() cration
很难给你非常严格的答案,因为你没有发布任何 UT 代码;)
EDIT
很难在一篇文章中涵盖嘲笑这样的大话题;)
这里有一些很棒的文章:
- 依赖注入:https://medium.com/@elye.project/fast-mocked-ui-tests-on-android-kotlin-89ed0a8a351a https://medium.com/@elye.project/fast-mocked-ui-tests-on-android-kotlin-89ed0a8a351a
- 使用不同的风味进行测试:https://android-developers.googleblog.com/2015/12/leveraging-product-flavors-in-android.html https://android-developers.googleblog.com/2015/12/leveraging-product-flavors-in-android.html
创建单元测试你总是可以做简单的事情:
presenter.sth = mockk<ISessionController>()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)