Android 当模拟对象位于lambda内部时,单元测试失败,但在';在lambda外部使用,在lambda内部使用?
我有一个对话框,我正在使用Mockito/Mockito Kotlin进行一些单元测试 当用户单击对话框时,会向用户显示一个时间列表,然后他们的选择会指定该值,然后对其执行其他操作 我模拟了一个timeProvider类,它只返回currentTime 这是对话框中进行选择的部分Android 当模拟对象位于lambda内部时,单元测试失败,但在';在lambda外部使用,在lambda内部使用?,android,mockito,mockito-kotlin,Android,Mockito,Mockito Kotlin,我有一个对话框,我正在使用Mockito/Mockito Kotlin进行一些单元测试 当用户单击对话框时,会向用户显示一个时间列表,然后他们的选择会指定该值,然后对其执行其他操作 我模拟了一个timeProvider类,它只返回currentTime 这是对话框中进行选择的部分 val currentTime = timeProvider.now() dialogBuilder.setItems(context.resources.getStringArray(R.array.silenceT
val currentTime = timeProvider.now()
dialogBuilder.setItems(context.resources.getStringArray(R.array.silenceTimes)) { _, which ->
val silenceUntil: Long = when (which) {
0 -> currentTime.plusMinutes(30).millis
1 -> currentTime.plusHours(1).millis
2 -> currentTime.plusHours(8).millis
3 -> currentTime.plusHours(24).millis
else -> 0
}
}
当代码在上面时,我的单元测试按预期工作。单击事件内的逻辑触发,时间设置为currentTime加30分钟
val items = arrayOf("0", "1", "2", "3")
val captor = argumentCaptor<DialogInterface.OnClickListener>()
val captor2 = argumentCaptor<DialogInterface>()
whenever(timeProvider.now()).thenReturn(currentTime)
whenever(dialogBuilder.setItems(eq(items), captor.capture())).thenReturn(dialogBuilder)
verify(dialogBuilder).setItems(eq(items), captor.capture())
captor.firstValue.onClick(captor2.capture(), eq(1))
我不明白为什么代码在lambda之外的时间工作,但在lambda内部却不工作
理想情况下,我不会在对话框之前设置它,因为谁知道在单击之前它实际上会保持打开状态多久,但是,我将来可能会遇到这样的问题,不允许这样的解决方法?所以我仍然不确定这里发生了什么,但我意识到,对于which值,我总是回到位置0(我想他们已经把它编入了索引)所以我试着删除了captor2 captor.firstValue.onClick(captor2.capture(),等式(1)) 一旦我这样做了,并且只传入null,1或null,2,它处理lambda中的值 “”_(ツ)_/“”
现在,我不需要另一个捕获器,所以我现在还可以…所以我仍然不确定这里发生了什么,但我意识到我总是返回位置0,以获取哪个值(我认为他们1索引了它),所以我尝试删除捕获器2 captor.firstValue.onClick(captor2.capture(),等式(1)) 一旦我这样做了,并且只传入null,1或null,2,它处理lambda中的值 “”_(ツ)_/“” 现在,我不需要另一个俘虏,所以我现在没事
dialogBuilder.setItems(context.resources.getStringArray(R.array.silenceTimes)) { _, which ->
val currentTime = timeProvider.now()
val silenceUntil: Long = when (which) {
0 -> currentTime.plusMinutes(30).millis
1 -> currentTime.plusHours(1).millis
2 -> currentTime.plusHours(8).millis
3 -> currentTime.plusHours(24).millis
else -> 0
}
}
org.mockito.exceptions.misusing.InvalidUseOfMatchersException:
Invalid use of argument matchers!
0 matchers expected, 2 recorded:
-> at com.nhaarman.mockitokotlin2.KArgumentCaptor.capture(ArgumentCaptor.kt:105)
-> at com.nhaarman.mockitokotlin2.MatchersKt.eq(Matchers.kt:34)
This exception may occur if matchers are combined with raw values:
//incorrect:
someMethod(anyObject(), "raw String");
When using matchers, all arguments have to be provided by matchers.
For example:
//correct:
someMethod(anyObject(), eq("String by matcher"));
For more info see javadoc for Matchers class.
at com.common.TimeProvider.now(TimeProvider.kt:8)