【问题标题】:Comparing Lists with scalatest将列表与 scalatest 进行比较
【发布时间】:2014-12-15 20:01:54
【问题描述】:

我正在使用 Scala 和 Akka 开始一个新项目,但在编写测试时遇到了麻烦。在我的测试中,我正在使用 should equal 检查两个 List 对象的相等性:

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 对象的方法。

这里是我的测试代码供参考:

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

}

【问题讨论】:

    标签: scala scalatest


    【解决方案1】:

    你可以试试:

    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(普通类)等于被覆盖。

    【讨论】:

    • 都没有用。两者都返回相同的错误消息。
    • 你是否重写了BookRow等于方法。
    • 没有。我没有重写 equals 方法。
    • 你需要它来让对象比较工作。
    • @nash_ag scalac 为案例类预生成等于。 gist.github.com/phadej/49bbeaef8715b2fca375
    【解决方案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)
    

    我想知道为什么会这样。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多