将列表与scalatest进行比较

将列表与scalatest进行比较,scala,scalatest,Scala,Scalatest,我正在使用Scala和Akka启动一个新项目,在编写测试时遇到了困难。在我的测试中,我正在使用应该相等检查两个列表对象的相等性: actualBook should equal (expectedBook) 我的测试套件中的所有内容都会编译并运行,但测试失败并显示以下消息: org.scalatest.exceptions.TestFailedException: List(BookRow(A,100.0,10.6)) did not equal List(BookRow(A,100.0,10

我正在使用Scala和Akka启动一个新项目,在编写测试时遇到了困难。在我的测试中,我正在使用
应该相等
检查两个
列表
对象的相等性:

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
    对象的方法
  • 以下是我的测试代码供参考:

    包lob

    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)
    
    }
    
    您可以尝试:

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


    假设您已经覆盖了
    BookRow
    (普通类)equals。

    我已经找到了一个解决方案,尽管我不明白它为什么有效!我只需要替换:

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


    我想知道为什么会这样。

    两者都不起作用。返回的错误消息相同。是否覆盖了
    BookRow
    equals方法。否。我没有重写equals方法。您需要它才能让对象比较工作。@nash_ag scalac为case类预生成equals。
    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)