在Mockk中模拟kotlin lambda回调时引发异常



我在用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

哎呀,我看错了错误。

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

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

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

最新更新