假设我有一个采用默认参数的方法:
trait Client {
def foo(data: String, unneededStuff: String = null): String
}
class Foo(client: Client) {
def doStuff(data: String) = client.foo(data)
}
对Foo
进行单元测试,我想验证它只调用一次客户端,并且不对其进行任何其他操作:
class FooSpec extends FunSpec with MockitoSugar {
describe("Foo") {
it("calls client once") {
val client = mock[Client]
when(client.foo(any, any)).thenReturn("bar")
new Foo(client).doStuff("baz") shouldBe "bar"
Mockito.verify(client).foo("baz", null)
Mockito.verifyNoMoreInteractions(client)
}
}
}
这不起作用,因为Client.foo
上的默认参数是作为Client
上的另一个方法调用实现的,因此verifyNoMoreInteractions
失败。
我可以通过null
明确地将client.foo
传递给Foo
中的 DateTime dt = new DateTime(1970, 1, 1, 0, 0, 0, 0).AddSeconds(923007501).ToLocalTime();
String.Format("{0:HH:mm:ss}", dt); // here is your formatted datetime
来解决这个问题,但是这种方式完全违背了默认参数 - 我永远不会将它们作为只要我关心测试东西:(
我想知道是否有人想知道更好的解决方法?我愿意在测试代码中做一些技巧,但我们避免将生产代码变成奇怪的东西,其唯一目的就是为了适应测试。