如何使用 KotlinTest 库验证测试方法中的模拟接口?



我有一个接口,可以与我的演示者通信,演示者检查表单的字段是否有效。

我的界面是:

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 () 函数失败,控制台中会出现错误,指示测试失败。

有没有更好的解决方案?

你提到了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。 有关详细信息,请参阅文档。 我现在要跳过它。

所以,现在你会调用方法:

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())

如果要更明确地说明传入的内容,则支持其他参数匹配器。

请注意,Mockito还支持选择加入最终类/方法的模拟。 Gradle 的示例类似于将文件添加到包含mock-maker-inline内容的src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker

引用:

  1. Mockito Javadoc
  2. mockito-kotlin维基文档

相关内容

  • 没有找到相关文章

最新更新