使用默认参数验证方法调用

时间:2017-06-06 14:52:33

标签: scala mockito scalatest

假设我有一个采用默认参数的方法:

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 来解决这个问题,但是这种方式完全违背了默认参数 - 我永远不会将它们作为只要我关心测试东西:(

我想知道是否有人想知道更好的解决方法?我愿意在测试代码中做一些技巧,但我们避免将生产代码变成奇怪的东西,其唯一目的就是为了适应测试。

0 个答案:

没有答案