Сравнение списков с помощью scalatest

Я начинаю новый проект, используя 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) также имеют одинаковый хеш-код).

Меня интересует, связана ли проблема с...

  1. мое использование неправильного оператора сравнения
  2. тот факт, что я явно не определил способ сравнения 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)

}

person davidrpugh    schedule 14.12.2014    source источник


Ответы (2)


Можешь попробовать:

List(BookRow(A,100.0,10.6)).toSeq should equal (List(BookRow(A,100.0,10.6)).toSeq)

Or:

List(BookRow(A,100.0,10.6) should contain theSameElementsAs List(BookRow(A,100.0,10.6))

Предполагая, что у вас есть BookRow (обычный класс), равно переопределенному.

person nitishagar    schedule 14.12.2014
comment
Ни один из них не работал. Для обоих возвращается одно и то же сообщение об ошибке. - person davidrpugh; 14.12.2014
comment
У вас есть переопределенный метод BookRow equals. - person nitishagar; 14.12.2014
comment
Нет. Я не переопределял метод equals. - person davidrpugh; 14.12.2014
comment
Ну, вам это нужно, чтобы сравнение объектов работало. - person nitishagar; 14.12.2014
comment
@nash_ag scalac предварительно генерирует equals для классов case. gist.github.com/phadej/49bbeaef8715b2fca375 - person phadej; 15.12.2014
comment
@OlegGrenrus Да, для класса case, но не для обычного класса. Отсюда вопрос. - person nitishagar; 15.12.2014
comment
@nash_ag в вопросе BookRow определяется как класс случая? - person phadej; 15.12.2014
comment
@OlegGrenrus Извините, когда я отвечал, не было кода для справки. Вот почему я просил равных. - person nitishagar; 15.12.2014
comment
Согласованный. BookRow на самом деле является классом case (который по умолчанию имеет реализацию equals). - person davidrpugh; 15.12.2014

Я нашел решение, хотя я не понимаю, почему оно работает! Мне просто нужно было заменить:

case class OrderRow(broker: String, volume: Double, price: String)

case class BookRow(broker: String, volume: Double, price: String)

с участием

private case class OrderRow(broker: String, volume: Double, price: String)

private case class BookRow(broker: String, volume: Double, price: String)

Я хотел бы знать, почему это работает.

person davidrpugh    schedule 15.12.2014