我有一个对话框,我正在使用Mockito / Mockito Kotlin进行一些单元测试。
当用户单击对话框时,将向用户显示时间列表,然后他们的选择将分配值,然后对其进行其他处理。
我有一个模拟的timeProvider类,它仅返回currentTime。
这是对话框中进行选择的部分
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中包含timeProvider时,它不再起作用,并给我一个参数匹配器错误吗?
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)
我不知道为什么代码可以在lambda之外而不是在lambda内使用时间?
理想情况下,我不会在对话框之前设置它,因为谁知道在单击之前他们实际上将其保持打开状态还有多长时间,而且,将来我可能会遇到类似这样的问题,因此不允许这种解决方法?
答案 0 :(得分:0)
所以我仍然不确定这里发生了什么,但是我意识到我一直在为那个值返回位置0(我认为他们为1索引了它),所以我尝试删除了captor2.capture。>
captor.firstValue.onClick(captor2.capture(),eq(1))
一旦我这样做了,就传入了null,1或null,2即可使用lambda中的值
¯__(ツ)_ /¯
现在,我不需要其他俘虏,所以我现在还可以...