我有以下课程:
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更适合这种情况的工具了吗? 最佳答案
这是强制编译器使用非专门的通用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
不够熟悉,无法保证这是惯用的,但是...关于scala - 非专业类型如何具有接受Function1的方法?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50667256/