假设我有这个类:
class Defaults {
def doSomething(regular: String, default: Option[String] = None) = {
println(s"Doing something: $regular, $default")
}
}
我想检查其他一些类在没有传递第二个参数的情况下调用实例doSomething()
上的方法:Defaults
defaults.doSomething("abcd") // second argument is None implicitly
但是,模拟Defaults
类无法正常工作。因为方法参数的默认值被编译为同一类中的隐藏方法,所以mock[Defaults]
返回一个对象,其中这些隐藏方法返回null
而不是None
,因此此测试失败:
class Test extends FreeSpec with ShouldMatchers with MockitoSugar {
"Defaults" - {
"should be called with default argument" in {
val d = mock[Defaults]
d.doSomething("abcd")
verify(d).doSomething("abcd", None)
}
}
}
错误:
Argument(s) are different! Wanted:
defaults.doSomething("abcd", None);
-> at defaults.Test$$anonfun$1$$anonfun$apply$mcV$sp$1.apply$mcV$sp(Test.scala:14)
Actual invocation has different arguments:
defaults.doSomething("abcd", null);
-> at defaults.Test$$anonfun$1$$anonfun$apply$mcV$sp$1.apply$mcV$sp(Test.scala:12)
原因很清楚,但有没有合理的解决方法?我看到的唯一一个是使用spy()
而不是mock()
,但我的模拟类包含很多方法,在这种情况下我将不得不显式模拟,我不想要它。