如何在Kotlin中模拟和验证Lambda表达式?

时间:2018-12-07 14:39:27

标签: testing lambda kotlin mockito

在Kotlin(和Java 8)中,我们可以使用Lambda表达式删除样板回调接口。例如,

data class Profile(val name: String)

interface ProfileCallback {
  fun onSuccess(profile: Profile)
}

class ProfileRepository(val callback: ProfileCallback) {

  fun getProfile() {
    // do calculation
    callback.onSuccess(Profile("name"))
  }
}

我们可以更改删除ProfileCallback并将其更改为Kotlin的Lambda:

class ProfileRepository(val callback: (Profile) -> Unit) {

  fun getProfile() {
    // do calculation
    callback(Profile("name"))
  }
}

这可以正常工作,但是我不确定如何模拟然后验证该功能。我有 尝试像这样使用Mockito

@Mock
lateinit var profileCallback: (Profile) -> Unit

@Test
fun test() {
    // this wouldn't work
    Mockito.verify(profileCallback).invoke(any())   
}

但它抛出异常:

  

org.mockito.exceptions.base.MockitoException:ClassCastException   在创建模仿者嘲笑:模仿类时发生:   'kotlin.jvm.functions.Function1',由classloader加载:   'sun.misc.Launcher$AppClassLoader@7852e922'

如何在Kotlin中模拟和验证Lambda表达?甚至有可能吗?

1 个答案:

答案 0 :(得分:0)

以下是使用mockito-kotlin来实现此目标的示例:

给出存储库类

class ProfileRepository(val callback: (Int) -> Unit) {

    fun getProfile() {
        // do calculation
        callback(1)
    }
}

使用mockito-kotlin lib-您可以像这样编写测试模拟lambda:

@Test
fun test() {
    val callbackMock: (Int) -> Unit = mock()
    val profileRepository = ProfileRepository(callbackMock)

    profileRepository.getProfile()

    argumentCaptor<Int>().apply {
        verify(callbackMock, times(1)).invoke(capture())
        assertEquals(1, firstValue)
    }
}