首页 > 解决方案 > 如何做非专业类型有接受 Function1 的方法?

问题描述

我有以下课程:

class Elem[T](t: T){
  def doSome(f: T => Unit):Unit = f(t)
}

所以我想测试给定Elem实例的函数调用(我正在使用 mockito)。运行测试时

val f = mock(classOf[Int => Unit])
new Elem(1).doSome(f)
verify(f).apply(1)

我得到以下异常:

Wanted but not invoked:
function1.apply$mcVI$sp(1);

However, there was exactly 1 interaction with this mock:
function1.apply(1);

这是合理的,因为Function1它专门用于Int. 所以使测试为

val f = mock(classOf[AnyRef => Unit])
new Elem(1.asInstanceOf[AnyRef]).doSome(f)
verify(f).apply(1.asInstanceOf[AnyRef])

工作正常。

有没有办法避免这种丑陋的演员阵容AnyRef?也许还有比 mockito 更适合这种情况的工具?

标签: scalafunctiontestingmockito

解决方案


这是强制编译器使用非专业泛型的一种方法apply

  def verifyGenericApply[X, Y](f: X => Y, x: X): Unit = {
    verify(f).apply(x)
  }

  "Int function" should "invoke non-specialized apply" in {
    class Elem[T](t: T){
      def doSome(f: T => Unit):Unit = f(t)
    }
    val f = mock(classOf[Int => Unit])
    new Elem(1).doSome(f)
    verifyGenericApply(f, 1)
  }

我不够熟悉,mockito无法保证这是惯用的,虽然......


推荐阅读