unit-testing - Cast exception when mocking kotlin lambda callbacks in 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))
}
Where the java signature for the callback would look like this:
public interface OnSuccessListener<T> {
void onSuccess(T var1);
}
and the signature for addOnSuccessListener looks like this
public abstract Task<DocumentReference> addOnSuccessListener(@NonNull OnSuccessListener<DocumentReference> var1);
My mock looks like this:
every { documentReferenceTask.addOnSuccessListener(any()) } answers {
firstArg<(DocumentReference) -> Unit>().onSuccess(documentReference)
value
}
I have also tried:
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
解决方案
糟糕,我误读了错误。
every { documentReferenceTask.addOnSuccessListener(any()) } answers {
firstArg<OnSuccessListener<DocumentReference>>().invoke(documentReference)
value
}
此方法有效,强制转换异常来自第二行。修正看起来像
every { documentReferenceTask.addOnSuccessListener(any()) } answers {
firstArg<OnSuccessListener<DocumentReference>>().invoke(documentReference)
**documentReferenceTask**
}
推荐阅读
- python - 如何在 Pycharm virtualenv 中使用 tkinter?
- python - 列表中的重叠序列
- css - 如何在悬停在一个元素上时暂停多个元素中的动画?
- python - 如何在不使用 numpy 的情况下创建零矩阵?
- android - 'void com.algolia.instantsearch.core.helpers.Searcher.destroy()' 在空对象引用上
- linux - 将文件 os.rename() 重命名为时间戳会返回奇怪的字符串
- javascript - Javascript addEventListener 不允许多个鼠标事件
- spring-boot - 春季集成领导选举在向控制总线发送消息时使用jdbc锁注册表撤销领导
- ios - iOS - 带有内容插入的粘性标题 - 标题视图不像单元格那样滚动
- javascript - 使用条件运算符运行多个语句将不起作用