我在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 one rrorOccurred(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的信息,但无法模拟该方法并调用适当的回调.任何关于改进结构的建议也将不胜感激.
谢谢
解决方法:
好吧,我认为您应该让SessionController实现一个接口.
object SessionController: ISessionController {
override fun signIn(username: String, password: String, signInCallBack: SignInCallBack) {
(...)
}
}
interface ISessionController {
fun fun signIn(username: String, password: String, signInCallBack: SignInCallBack)
}
这将为您提供很多解决问题的可能性,例如:
>依赖注入
>测试产品风味
>测试代码中的简单嘲笑()创建
给您一个非常严格的答案有点困难,因为您没有发布任何UT代码;)
编辑
很难在一个帖子中涵盖嘲笑这样的大话题;)
这里有一些很棒的文章:
>依赖注入: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
创建单元测试,您始终可以做得简单:
presenter.sth = mockk<ISessionController>()
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。