Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何模仿Kotlin';这是什么?_Kotlin_Mockito_Powermock_Robolectric_Mockito Kotlin - Fatal编程技术网

如何模仿Kotlin';这是什么?

如何模仿Kotlin';这是什么?,kotlin,mockito,powermock,robolectric,mockito-kotlin,Kotlin,Mockito,Powermock,Robolectric,Mockito Kotlin,对于下面给定的代码,在Kotlin中,无法执行函数forEach(或类似的,map,filter,等等…),因为BarList是模拟的。因此,forEach和亲戚的本机实现没有被调用。在互联网上搜索了一段时间后,我发现: 公共类BarList扩展AbstractList实现OrderedBarCollection{ //... } //... val mockedList:BarList=mockBarList() val-whoolist=listOf(Foo()) `当`(mockedLis

对于下面给定的代码,在Kotlin中,无法执行函数
forEach
(或类似的,
map
filter
,等等…),因为
BarList
是模拟的。因此,
forEach
和亲戚的本机实现没有被调用。在互联网上搜索了一段时间后,我发现:

公共类BarList扩展AbstractList实现OrderedBarCollection{
//...
}
//...
val mockedList:BarList=mockBarList()
val-whoolist=listOf(Foo())
`当`(mockedList.iterator())。然后返回(doulist.iterator())
`当`(mockedList.size).时,然后返回(doulist.size)
com.nhaarman.mockito_kotlin
.doCallRealMethod()
.`when`(模拟列表)
.forEach(Mockito.any())//尝试调用使用者。
mockedList.forEach{foo->
//不执行
}
根据这个问题的答案,我尝试了上述方法:

我还尝试:

com.nhaarman.mockito_kotlin.doCallRealMethod().`when`(mockedList.forEach(any())
但它导致:

org.mockito.exceptions.misusing.InvalidUseOfMatchersException: 
Invalid use of argument matchers!
0 matchers expected, 1 recorded:
//...
Kotlin源代码中的
forEach
定义如下:

public-inlinefuniterable.forEach(动作:(T)->Unit):单位
我想我应该把
any()
替换成与
动作:(T)->Unit
匹配的东西,但我不知道怎么做。 如果需要,我不介意使用interactor,但我至少需要让
forEach
按预期运行。你们能帮帮我吗

问候,


Pedro

我认为您根本无法模拟扩展函数,因为它们不是目标类的成员

forEach
只是
Iterable

在这种情况下,您仍将在
傻瓜
上调用kotlin的常规
forEach


我不明白模拟集合的动机是什么,尤其是用simple
ArrayList
listOf
)代替模拟
OrderedBarCollection
的迭代器,需要做什么?

解决方案是对模拟列表使用
然后使用Answer
而不是
然后使用Return

`when`(mockedList.iterator())。然后回答{dublist.iterator()}
原因:

作者:Tobias Berger

迭代器只适用于遍历列表一次。所以 每次调用迭代器()函数时,通常都会得到一个新函数。 如果您使用thenReturn(messageList.iterator())模拟它,它将 只需在messageList上调用一次,然后重用迭代器实例 每次你试着为你的模拟得到一个。一旦你的第一圈结束 此迭代器完成后,它将始终说它没有更多项。 使用thenAnswer,您可以定义一个供应商,该供应商在每次您的 使用mocked函数,为每个调用提供一个新的迭代器(如图所示) (预计会有)


你为什么要嘲笑这份名单?你不能用你想要测试的虚假数据创建列表实例吗?原因:请阅读以下内容: