【问题标题】:Cast exception when mocking kotlin lambda callbacks in Mockk在 Mockk 中模拟 kotlin lambda 回调时抛出异常
【发布时间】:2018-12-17 03:19:24
【问题描述】:

我在使用 Mockk 模拟回调函数时遇到了一些问题。

我正在尝试模拟一个这样调用的任务成功侦听器:

collection
    .add(Item())
    .addOnSuccessListener {
        update(collection.document(it.id))
    }

回调的 java 签名如下所示:

public interface OnSuccessListener<T> {
    void onSuccess(T var1);
}

addOnSuccessListener 的签名看起来像这样

public abstract Task<DocumentReference> addOnSuccessListener(@NonNull OnSuccessListener<DocumentReference> var1);

我的模拟看起来像这样:

every { documentReferenceTask.addOnSuccessListener(any()) } answers {
    firstArg<(DocumentReference) -> Unit>().onSuccess(documentReference)
    value
}

我也试过了:

every { documentReferenceTask.addOnSuccessListener(any()) } answers {
    firstArg<OnSuccessListener<DocumentReference>>().invoke(documentReference)
    value
}

无论哪种方式,我都会收到如下类型的转换异常:

java.lang.ClassCastException: com.package.MyClass$addProduct$1 cannot be cast to kotlin.jvm.functions.Function1

【问题讨论】:

  • 嗨,addOnSuccessListener 的签名是什么?
  • 我已经更新了原帖
  • 我不太明白。问题解决了吧?

标签: unit-testing kotlin mockk


【解决方案1】:

糟糕,我误读了错误。

every { documentReferenceTask.addOnSuccessListener(any()) } answers {
    firstArg<OnSuccessListener<DocumentReference>>().invoke(documentReference)
    value
}

此方法有效,强制转换异常来自第二行。更正看起来像

every { documentReferenceTask.addOnSuccessListener(any()) } answers {
    firstArg<OnSuccessListener<DocumentReference>>().invoke(documentReference)
    **documentReferenceTask**
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-13
    • 2022-09-27
    • 2018-04-20
    • 1970-01-01
    • 1970-01-01
    • 2021-03-05
    • 1970-01-01
    • 2019-07-25
    相关资源
    最近更新 更多