1

Specs2 を使用してしばらくの間コードをテストしてきましたが、テストでは、あるタイプの 2 つのオブジェクトが正しく比較されることを確認したいと考えていました。

"compare based on carrier value" in {
  val b0 = new BitField32(343948)
  val b0prim = new BitField32(343948)
  val b1 = new BitField32(112)

  b0prim should be equalTo(b0)
  b1 should not be equalTo(b0)
}

このテストを実行すると、エラーが発生しました

[error] x compare based on carrier value
[error]    'core.BitField32@17805bd5' is not equal to 'core.BitField32@6c0d0900' (BitField32Spec.scala:34)
[error] Expected: ...ld32@[6c0d0900]
[error] Actual:   ...ld32@[17805bd5]

私のクラスには比較のためのメソッドがなかったので、これは合理的に思えました。そこで、思いついたことをいくつか試してみました。Orderedさまざまな比較方法を実装して提供することです。

/**
 * mutable 32bit Bitfield
 */
class BitField32(var carrier: Int) extends Ordered[BitField32]{

  override def equals(that: Any) = true
  def canEqual(that: Any) = true

  def compare(that: BitField32) = this.carrier - that.carrier
  def ===(that: BitField32) = this.carrier == that.carrier
  def ==(that: BitField32) = this.carrier == that.carrier
  //(...)
}

しかし、私はまだ同じエラーが発生し続けます。equalTo マッチャーがどのように機能するかを確認するために specs2 のソースを読み込もうとしましたが、その後はあまりよくわかりませんでした。

(ストック)specs2マッチャーが平等を取得するためにクラスを変更する方法はありますか?

BitField32 は設計上ケース クラスではありません。可変にしたいのです。

4

1 に答える 1

2

比較メソッドを追加した後、実際にエラー メッセージを読み違えてしまいました。比較されたオブジェクトが等しいはずがないにもかかわらず、等しいと言っていたのです。specs2 で使用される比較は適切であり、常に true (equalsメソッド) を返していました。固定コードは次のとおりです。

class BitField32(var carrier: Int){

  override def equals(that: Any) = that match {
    case bf: BitField32 => this == bf
    case _ => false
  }

  def ==(that: BitField32) = this.carrier == that.carrier
}
于 2012-12-04T11:11:47.243 に答える