我正在使用Scala和Akka启动一个新项目,编写测试时遇到了麻烦。在测试中,我List使用should equal以下命令检查两个对象的相等性:
actualBook should equal (expectedBook)
Run Code Online (Sandbox Code Playgroud)
我的测试套件中的所有内容均可编译并运行,但是测试失败并显示以下消息:
org.scalatest.exceptions.TestFailedException: List(BookRow(A,100.0,10.6)) did not equal List(BookRow(A,100.0,10.6))
Run Code Online (Sandbox Code Playgroud)
显然,测试正在通过(即,两个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)
}
Run Code Online (Sandbox Code Playgroud)
你可以试试:
List(BookRow(A,100.0,10.6)).toSeq should equal (List(BookRow(A,100.0,10.6)).toSeq)
Run Code Online (Sandbox Code Playgroud)
或者:
List(BookRow(A,100.0,10.6) should contain theSameElementsAs List(BookRow(A,100.0,10.6))
Run Code Online (Sandbox Code Playgroud)
假设你有BookRow(普通班级)等于覆盖。
我找到了解决方案,尽管我不明白它为什么有效!我只需要更换:
case class OrderRow(broker: String, volume: Double, price: String)
case class BookRow(broker: String, volume: Double, price: String)
Run Code Online (Sandbox Code Playgroud)
和
private case class OrderRow(broker: String, volume: Double, price: String)
private case class BookRow(broker: String, volume: Double, price: String)
Run Code Online (Sandbox Code Playgroud)
我想知道为什么这有效。
| 归档时间: |
|
| 查看次数: |
5132 次 |
| 最近记录: |