使用ScalaMock中的mockedResource.expects(where(???))自定义匹配器的更具描述性的失败消息

时间:2018-04-10 21:45:02

标签: scala logging scalatest scalamock

我正在使用ScalaMock和ScalaTest来组合一些单元测试。我想使用ScalaMock的期望语法来确认我正在处理的服务将可接受的Json传递给模拟资源。在这种情况下,可接受意味着一些内部字段可能不同,因此我编写了一个自定义函数来确定我关心的字段是否匹配。问题在于,当未满足期望时,它会产生相对无益的日志记录。预期设定如下:

(mockedResource.doAThing(_: Json)(_: SomeImplicitThing))
  .expects(
    where(
      jsonSimilarAndImplicitEqual(
        expectedJson,
        anInstanceOfImplicitThing
      )(_, _)
    )
  )

在失败时生成以下日志记录:

- should forward acceptable Json to the mockedResource
  Unsatisfied expectation:

  Expected:
  [info]   inAnyOrder {
  [info]     <mock-1> MockedResource.doAThing<function1> once (never called - UNSATISFIED)
  [info]   }

我希望能够提供一些自定义日志记录功能来描述jsonSimilarAndImplicitEqual在合理的地方评估为假的原因。我希望inAnyOrderWithLogging块足够证明,但事实证明我甚至不能使用这个构造,因为AsyncMockFactory不支持它。

1 个答案:

答案 0 :(得分:0)

您可以使用specs2-mock(Mockito的包装)代替ScalaMock,并使用argument captor。使用org.specs2.Mockito特征,您可以编写val captor = capture[String],然后编写there was one(value).method(captor.capture)。一旦您捕获了参数,就可以使用scalatest Matchers来断言相关属性。