当尝试使用具有更高阶函数的Mockito的验证API时,我遇到了一个奇怪的错误。我无法将高阶函数与任何参数匹配器匹配。我在一个玩具程序中重复了这个问题。 a定义为mock[A]
。
a.foo(
1533616236920L,
<any scala.Function1>
);
-> at com.salesforceiq.spark.migration.AuditSpec$$anonfun$3.apply$mcV$sp(AuditTest.scala:166)
Actual invocation has different arguments:
a.foo(
1533616225920L,
<function1>
);
正在传递的实际函数不在此表格上
val requestFilter: (RetentionRequest => Boolean) = request => a.getStatusOfRequest(request, id).get != Status.Done.toString
实际验证块:
verify(f.a, times(1)).foo(eqTo(f.time), any(classOf[RetentionRequest => Boolean]))
这是由于模仿者如何解释Scala HOF的原因,还是我调用其API的方式的问题。如果是这样,最好的解决方法是什么?
Mockito版本:2.2.1.0 Scala版本:2.11.11
答案 0 :(得分:1)
Mockito应该能够处理Scala HOF。这是一个小例子:
import org.scalatest.FlatSpec
import org.mockito.Mockito._
import org.mockito.Matchers.{any, eq => eqTo}
class HOFSpec extends FlatSpec {
class A {
def foo(i: Int, f: Int => Boolean): Boolean = f(i)
}
"Mockito" should "handle higher-order functions" in {
val a = mock(classOf[A])
when(a.foo(any(classOf[Int]), any(classOf[Int => Boolean]))).thenReturn(true)
a.foo(3, x => x == 7)
verify(a, times(1)).foo(eqTo(3), any(classOf[Int => Boolean]))
}
}
由于foo
的第一个参数,测试实际上可能失败:
1533616236920L // wanted
1533616225920L // actual
通知,1533616236920 - 1533616225920 != 0