将列表与scalatest进行比较

时间:2014-12-14 15:37:18

标签: scala 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个对象包含相同的内容)。不确定这是否相关,但actualBookexpectedBook具有相同的哈希码(actualBook(0)expectedBook(0)也具有相同的哈希码。)

我想知道问题是否是由于......

  1. 我使用了错误的比较运算符
  2. 我没有明确定义比较BookRow对象的方法。
  3. 这里参考我的测试代码:

    包高峰

    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)
    
    }
    

2 个答案:

答案 0 :(得分:3)

您可以尝试:

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

或者:

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

假设你有BookRow(普通类)等于被覆盖。

答案 1 :(得分:2)

我找到了解决方案,虽然我不明白为什么会这样!我只需要替换:

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)

我想知道为什么会这样。