我在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但是无法模拟这个方法并调用适当的回调。关于改善结构的任何建议也将受到赞赏。
由于
答案 0 :(得分:3)
在我看来,你应该让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代码,所以给你非常严格的答案有点困难;)
修改
在一个帖子中很难涵盖如此嘲弄这么大的话题;) 这里有一些很棒的文章:
创建单元测试你总是可以做到简单:
presenter.sth = mockk<ISessionController>()