我有一个与我的演示者通信的界面,该演示者检查表单的字段是否有效。
我的界面是:
interface MainView {
fun showMessage(data: LoginEntity)
fun showEmailError()
fun showPasswordError()
}
我在演示者中的方法是这样的:
fun sendForm(loginData: LoginDataPresentation, view: MainView) {
if (isValid()) {
view.showMessage(mapData(loginData))
} else if (isValidPassword()) {
view.showPasswordError()
} else {
view.showEmailError()
}
}
我的KotlinTest测试课:
class LoginPresentationKtTest : StringSpec() {
init {
"given a bunch of Login Data should be matched successfully" {
forAll(EmailGenerator(), PasswordGenerator(), { email: String, password: String ->
val loginData: LoginDataPresentation(email, password)
val mockMainView = mockMainView()
sendForm(loginData, mockMainView())
})
}
}
private fun mockMainView(): MainView {
//How to mock?????
}
}
使用KotlinTest库,有没有办法验证是否已完成对MainView类的showMessage方法的调用,只要生成的电子邮件和密码始终正确?是否可以使用像mockito这样的模拟库?
根据用户@mkobit的响应,可以使用Mockito-Kotlin进行以下修改,测试结果如下:
class LoginPresentationKtTest : StringSpec() {
init {
"given a bunch of Login Data should be matched successfully" {
forAll(EmailGenerator(), PasswordGenerator(), { email: String, password: String ->
val loginData = LoginDataPresentation(email, password)
val mockMainView = Mockito.mock(MainView::class.java)
sendForm(loginData, mockMainView)
verify(mockMainView).showMessage()
true
})
}
}
}
每次执行循环时,都会检查是否已调用verify()函数。如果执行流程是预期的,它将继续执行循环的下一次执行。如果verify()函数失败,控制台中将发生错误,指示测试失败。
有没有更好的解决方案?
答案 0 :(得分:0)
你提到Mockito,所以我会告诉你可以举例。我还将使用nhaarman/mockito-kotlin
库,使其更具表现力,更易于在Kotlin中使用。
import com.nhaarman.mockito_kotlin.mock
val mockMainView: MainView = mock()
这基本上相当于Mockito的val mockMainView = Mockito.mock(MainView::class.java)
。
在Kotlin中,由于它的一些功能,我们可以获得更简洁和紧凑的代码。
如果你想做一些存根(比如返回值,异常等),你可以使用whenever
(Mockito.when(T methodCall)
)API。
请参阅documentation for details。
我现在要跳过它。
所以,现在你要求方法:
sendForm(loginData, mockMainView)
然后,您可以执行验证。
使用mockito-kotlin
方法verify
(Mockito.verify(T mock)
)行为。
import com.nhaarman.mockito_kotlin.verify
verify(mockMainView).showPasswordError()
verify(mockMainView).showEmailError()
使用any()
(Mockito.any(Class<T> type)
)不仅仅使用任何值调用验证方法。
import com.nhaarman.mockito_kotlin.any
verify(mockMainView).showMessage(any())
如果您希望更明确地传递内容,则可以支持其他argument matchers。
请注意,Mockito还支持opt-in mocking of final classes/methods。
Gradle的示例就像将文件添加到src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker
,内容为mock-maker-inline
。
参考文献: