Я начинаю новый проект, используя Scala и Akka, и у меня возникают проблемы с написанием тестов. В своих тестах я проверяю равенство двух объектов List
, используя should equal
:
actualBook should equal (expectedBook)
Все в моем наборе тестов компилируется и запускается, но тесты завершаются со следующим сообщением:
org.scalatest.exceptions.TestFailedException: List(BookRow(A,100.0,10.6)) did not equal List(BookRow(A,100.0,10.6))
Ясно, что тесты проходят (т. е. оба объекта List
содержат одинаковое содержимое). Не уверен, имеет ли это значение, но actualBook
и expectedBook
имеют одинаковый хэш-код (и actualBook(0)
и expectedBook(0)
также имеют одинаковый хеш-код).
Меня интересует, связана ли проблема с...
- мое использование неправильного оператора сравнения
- тот факт, что я явно не определил способ сравнения
BookRow
объектов.
Для справки вот код для моих тестов:
пакет
import cucumber.api.DataTable
import org.scalatest.Matchers._
import scala.collection.JavaConversions._
import cucumber.api.java.en.{When, Then}
class OrderBookSteps {
val orderTypes = OrderType.all()
val buyBook: OrderBook = new OrderBook(Bid, orderTypes)
val sellBook: OrderBook = new OrderBook(Ask, orderTypes)
@When("""^the following orders are added to the "(.*?)" book:$""")
def ordersAddedToBook(sideString: String, orderTable: DataTable) {
val (side, book) = getBook(sideString)
val orders = orderTable.asList[OrderRow](classOf[OrderRow]).toList.map(
r => LimitOrder(r.broker, side, r.volume, r.price.toDouble))
orders.foreach(book.add)
}
@Then("""^the "(.*?)" order book looks like:$""")
def orderBookLooksLike(sideString: String, bookTable: DataTable) {
val (_, book) = getBook(sideString)
val expectedBook = bookTable.asList[BookRow](classOf[BookRow]).toList
val actualBook = book.orders().map(o => BookRow(o.broker, o.volume, orderTypes(o).bookDisplay))
actualBook should equal (expectedBook)
}
def getBook(side: String) = side match {
case "Bid" => (Bid, buyBook)
case "Ask" => (Ask, sellBook)
}
case class OrderRow(broker: String, volume: Double, price: String)
case class BookRow(broker: String, volume: Double, price: String)
}