具有高阶函数的Mockito参数匹配器

时间:2018-08-21 05:37:14

标签: scala mockito scalatest

当尝试使用具有更高阶函数的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

1 个答案:

答案 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