在 Mockk 中模拟 kotlin lambda 回调时抛出异常

Cast exception when mocking kotlin lambda callbacks in Mockk

我在使用 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 cannot be cast to kotlin.jvm.functions.Function1

糟糕,我看错了。

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

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

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