当模拟对象位于 lambda 内部时,单元测试失败,但当它在 lambda 外部并在 lambda 中使用时有效?



我有一个对话框,我正在对使用Mockito/Mockito Kotlin进行一些单元测试。

当用户单击对话框时,将向用户显示一个时间列表,然后他们的选择将分配该值,然后对其进行其他一些工作。

我有一个我模拟的 timeProvider 类,它只返回当前时间。

这是进行选择的对话框部分

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
}
}

当上面的代码时,我的单元测试按预期工作。 单击事件中的逻辑将触发,并将时间设置为当前时间加上 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(我认为他们 1 索引了它),所以我尝试删除 captor2.capture 在这个

captor.firstValue.onClick(captor2.capture(), eq(1))

一旦我这样做了,并且只是传入 null,1 或 null,2,它就可以与 lambda 中的值一起使用

̄_(ツ)_/̄

现在,我不需要另一个俘虏,所以我现在没事......

相关内容

  • 没有找到相关文章

最新更新