在 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**
}
我在使用 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**
}