3

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

我的界面是:

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

有没有更好的解决方案?

4

1 回答 1

0

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

import com.nhaarman.mockito_kotlin.mock

val mockMainView: MainView = mock()

这基本上相当于val mockMainView = Mockito.mock(MainView::class.java)来自 Mockito。在 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 还支持对 final classes/methods 的选择性模拟src/test/resources/mockito-extensions/org.mockito.plugins.MockMakerGradle的示例类似于将文件添加到mock-maker-inline.

参考:

  1. Mockito Javadoc
  2. mockito-kotlin维基文档
于 2018-03-27T14:00:34.823 回答