【问题标题】:How does ScalaTest check equality?ScalaTest 如何检查相等性?
【发布时间】:2015-05-08 23:57:15
【问题描述】:

我参考this

我是 ScalaTest 的新手,但我将其解释为,如果我实现了 ==,那么它将用于解释 should equal。但是,我的代码似乎与此相矛盾。

我正在处理Odersky's book - 我正在练习 6.0.3。我已经实现了上述自然数,并添加了相等运算符:

class Succ(x: Nat) extends Nat {
  ...
  override def ==(that:Nat): Boolean = {
    try {
      (that - this).isZero
    } catch {
      case _: Throwable => false
    }
  }
}

object Zero extends Nat {
  ...
  override def ==(that:Nat): Boolean = {
    that.isZero
  }
}

但是,以下测试用例失败:

def makeNat(n:Integer):Nat = {
  if (n < 0) throw new RuntimeException("Can't generate Nat from <0: " + n.toString())
  if (n==0) return Zero
  else return makeNat(n-1).suc
}

test("Addition is commutative") {

   val nats = for (n <- Gen.choose(0, 1000)) yield  makeNat(n)
   val p = forAll ((nats, "n1"), (nats, "n2")) {
      (n1: Nat, n2: Nat) =>
        (n1 + n2) should equal (n2 + n1) //Fails
    }

}

但是减去参数并与零比较:

test("Addition is commutative") {

  val nats = for (n <- Gen.choose(0, 1000)) yield  makeNat(n)

  val p = forAll ((nats, "n1"), (nats, "n2")) {
    (n1: Nat, n2: Nat) =>
      ((n1 + n2)-(n2+n1)) should equal (Zero) // Passes
  }

}

编辑:感谢 dwickern@,这已解决 - 我需要为 equals 方法添加覆盖,而不是 == 方法。即:

  override def equals(that:Any): Boolean = that match {
    case that:Nat => (that-this).isZero
    case _ => false
  }

【问题讨论】:

  • 你在覆盖什么==? Scala 的== 方法调用标准Java Object.equals。您应该覆盖 equals
  • 我只覆盖了 ==,但是(如上面编辑的那样)我现在也覆盖了 .equals,并且得到了相同的结果。
  • 忽略 - 我想我在保存之前运行了测试。现在测试通过了!感谢您的帮助!

标签: scala equality scalatest


【解决方案1】:

如您所见,您需要覆盖 equals 而不是 ==。 scala 中的== 方法调用Java 的标准Object.equals,但它可以正确处理null 而不会抛出异常。

实际上,您不需要经常覆盖equals,因为存在案例类。要使用它们,请将您的 class 更改为 case class 并将您的 object 更改为 case object。编译器将为您实现equalshashCode。如果类遵循以下模式,则案例类非常适合:

  • 类被视为一个值。 (对于自然数类来说绝对正确!)
  • 案例类应该是不可变的。平等和可变性不能混为一谈。
  • 避免类继承。平等+继承是复杂的。改用特征。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-24
    • 1970-01-01
    • 2012-03-14
    • 1970-01-01
    • 2010-12-07
    • 2015-08-09
    • 2015-11-23
    • 2020-05-13
    相关资源
    最近更新 更多