gpt4 book ai didi

unit-testing - 如何使用 KotlinTest 库在测试方法中验证模拟接口(interface)?

转载 作者:行者123 更新时间:2023-11-28 20:13:44 24 4
gpt4 key购买 nike

我有一个与演示者通信的界面,演示者检查表单的字段是否有效。

我的界面是:

interface MainView {
fun showMessage(data: LoginEntity)
fun showEmailError()
fun showPasswordError()
}

我在presenter中的方法是这样的:

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()函数失败,控制台会报错,提示测试失败。

有没有更好的解决方案?

最佳答案

您提到了 Mockito,所以我将向您展示示例。我还将使用 nhaarman/mockito-kotlin 使其在 Kotlin 中更具表现力和更易于使用的库。

import com.nhaarman.mockito_kotlin.mock

val mockMainView: MainView = mock()

这基本上等同于val mockMainView = Mockito.mock(MainView::class.java)来自 Mockito。在Kotlin中,由于其一些特性,我们可以获得更加简洁紧凑的代码。

如果你想做一些 stub (比如返回值、异常等),你可以使用 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 .

引用资料:

  1. Mockito Javadoc
  2. mockito-kotlin Wiki documentation

关于unit-testing - 如何使用 KotlinTest 库在测试方法中验证模拟接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49507261/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com