在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表达?甚至有可能吗?
答案 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)
}
}