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 は設計上ケース クラスではありません。可変にしたいのです。