【问题标题】:How to mock and verify Lambda expression in Kotlin?如何在 Kotlin 中模拟和验证 Lambda 表达式?
【发布时间】:2019-05-09 08:20:52
【问题描述】:

在 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"))
  }
}

我们可以把remove 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 在创建 mockito 模拟时发生:要模拟的类: 'kotlin.jvm.functions.Function1',由类加载器加载: 'sun.misc.Launcher$AppClassLoader@7852e922'

如何在 Kotlin 中模拟和验证 Lambda 表达式?有没有可能?

【问题讨论】:

标签: testing lambda kotlin mockito


【解决方案1】:

以下是使用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)
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多