在Mockk中模拟Kotlin Lambda回调时引发异常 [英] Cast exception when mocking kotlin lambda callbacks in Mockk

查看:194
本文介绍了在Mockk中模拟Kotlin Lambda回调时引发异常的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在使用Mockk模拟回调函数时遇到一些麻烦.

I am having some trouble mocking callback functions with Mockk.

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

I am trying to mock a task success listener that is called like this:

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

回调的Java签名如下所示:

Where the java signature for the callback would look like this:

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

和addOnSuccessListener的签名看起来像这样

and the signature for addOnSuccessListener looks like this

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
}

无论哪种方式,我都会收到类似以下的强制转换异常:

Either way, I am receiving a cast exception like:

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

推荐答案

糟糕,我误读了该错误.

Oops, I was misreading the error.

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

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

This method works, the cast exception was from the second line. The correction looks like

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

这篇关于在Mockk中模拟Kotlin Lambda回调时引发异常的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆