【发布时间】:2019-04-25 18:56:17
【问题描述】:
假设我有两个类型类 Numeric 的实例。
class Money(c: String, x: Long, y: Int)
class Quantity(c: String, x: Long, y: Int)
implicit val numericMoney: Numeric[Money] = new Numeric[Money]
implicit val numericQuantity: Numeric[Quantity] = new Numeric[Quantity]
Money 和 Quantity 在 Numeric 实例中的行为应该相同。 我有 scalaTest 测试来检查 Money 的行为是否正确。
例如
import implicits.NumericMoney.numericMoney._
class MoneyOpsSpec extends WordSpec with Matchers {
val max = Money("", Long.MaxValue, 999999999)
val min = Money("", Long.MinValue, -999999999)
"A Money object" when {
"zero" should {
"be neutral element under addition" in {
zero + Money("", 15, 50) should ===(Money("", 15, 50))
Money("", 15, 50) + zero should ===(Money("", 15, 50))
}
"be neutral element under subtraction" in {
zero - Money("", 15, 50) should ===(Money("", -15, -50))
Money("", 15, 50) - zero should ===(Money("", 15, 50))
}
"be invariant under negation" in {
-zero should ===(zero)
}
}
}
}
Quantity 规范应该以相同的方式执行。我可以实现一个通用规范并使用Money 和Quantity 作为该规范的输入吗?或者 scalaTest 或 specs2 是否有一些东西可以确保 Numeric 类型类实例的行为正确?我可以轻松切换测试框架。
【问题讨论】:
标签: scala typeclass scalatest specs2