unit-testing - 如何使用 mockito 测试使用 Kotlin 调用的回调
问题描述
我有一个接受回调的 Kotlin 类,如下所示:
class MyKotlinClass (private val handleSomeCallBack: (ByteArray) -> Unit) {
private val someBuffer = BytesBuilder()
fun myFunction(bytesList: List<Byte>) {
handleSomeCallBack(someBuffer.toArray())
}
}
我不太清楚如何将 Mockito 与 jUnit 一起使用来测试回调是否被调用。
我觉得我应该使用 anargumentCaptor
而不是 spy,但不太确定。
我目前拥有的如下:
@RunWith(MockitoJUnitRunner::class)
class MyKotlinClassTests : BaseTest() {
private lateinit var myKotlinClass: MyKotlinClass
@Before
fun setUp() {
MockitoAnnotations.initMocks(this)
}
@Test
fun `test callback is called when message is passed in`() {
val captor = argumentCaptor<(data: ByteArray) -> Unit>()
myKotlinClass = MyKotlinClass(capture(captor))
val rawDataBytes = byteArrayOf(0x01, 0x02, 0x03, 0x04, 0x05)
myKotlinClass.myFunction(rawDataBytes.toList())
verify(captor, once())
}
}
使用上述内容,我收到以下错误:
java.lang.IllegalArgumentException: Parameter specified as non-null is null: method MyKotlinClass.<init>, parameter handleSomeCallBack
测试我的回调是否被调用并评估与它一起传递的数据的正确方法是什么(someBuffer
)?
解决方案
为此,您不需要mockito。只需创建 lamda 并将您的值存储在列表中,然后断言这些值。
@Test
fun `test callback is called when message is passed in`() {
val captor = arrayListOf<ByteArray>()
val myKotlinClass = MyKotlinClass ({
captor.add(it)
})
val rawDataBytes = byteArrayOf(0x01, 0x02, 0x03, 0x04, 0x05)
myKotlinClass.myFunction(rawDataBytes.toList())
//Assert size
Assert.assertTrue(captor.size == 1)
//Assert ByteArray values
}
推荐阅读
- react-native - react-navigation BottomTabNavigator 在生产中被切断
- python - KeyError:“[Int64Index dtype='int64', length=9313)] 都不在 [columns] 中”
- typescript - 使用约束创建映射类型的对象
- javascript - javascript如何分配参考值?
- javascript - 合并和组合具有相同日期的数组项
- r - 通过删除括号内的所有文本
- android - 保存视频前的ffmpeg实时预览
- python - IndexError:运行 mask-rcnn 时列表索引超出范围?
- android - InputManager 自动从列表中删除无线控制器
- python - 如何修复 [Errno 20] 不是目录:'/app/myProjectManager/settings.py/staticfiles/staticfiles.json' Django