ScalaMock:期望在一定公差范围内的 Double

ScalaMock : expect a Double within some tolerance

我正在使用 MockFunction1,期待一个参数并期待它被调用一次。

mockFunction.expects(result).once()

result 对象的类型包含多个 Double 类型的值。

我希望预期的 result 对象在一定的公差范围内与实际对象相匹配。 (例如,如果实际对象包含值 10.742345,我希望值 10.74 的预期对象匹配)。

我怎样才能做到这一点?

编辑: result 对象的类型是以下形式:

class Result {
 ...
  m: Metrics,
 ...
}
class Metrics {
 ...
  a: Double,
  b: Double,
 ...

}

您可以使用 where 作为自定义匹配器:

import org.scalamock.scalatest.MockFactory
import org.scalamock.function.FunctionAdapter1

case class Foo(d: Double, otherField: String)

trait Service {
  def f(p: Foo): String = s"call f on $p"
}

// add function to construct custom matchers:
def toTolerantMatcher(expected: Foo): FunctionAdapter1[Foo, Boolean] =
  where {
    (actual: Foo) => (~expected.d).equals(actual.d) && expected.otherField == actual.otherField
  }

// and use it in your test:
val service = mock[Service]
val expected = Foo(0.0004, "example")
(service.f _).expects(toTolerantMatcher(expected)).once()
val actual = Foo(0.0003, "example")
service.f(actual)

inside toTolarantMatcher 一元运算符 ~d 字段与公差进行比较(来自 org.scalamock.matchers):

object MatchEpsilon {

  val epsilon = 0.001
}

似乎在 scalamock 中没有提供默认比较器来比较一个类型的所有实例的内置机制。

为了解决这个问题,我最终使用 'argument capture' 并为整个对象编写了一个自定义比较器:

val actualResult = CaptureOne[Result]()
mockFunction expects capture(actualResult) once
....
actualResult.value.shouldEqual(result)(EqualityWithTolerance)