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)
我正在使用 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)