Я хочу утверждать равенство в ScalaTest классов case, содержащих Array. (Таким образом, встроенный в matchers равенства для случая классов не применяются.) Пример:Как получить осмысленные сообщения об ошибках для встраиваемых маркеров равенства в scala?
case class Example(array: Array[Double], variable: Integer)
испытания заглушки:
val a = Example(Array(0.1, 0.2), 1)
val b = Example(Array(0.1, 0.2), 1)
a should equal (b)
терпит неудачу, как и ожидалось. Поэтому я реализую знак равенства:
implicit val exampleEq =
new Equality[Example] {
def areEqual(left: Example, right: Any): Boolean =
right match {
case other: Example => {
left.array should contain theSameElementsInOrderAs other.array
left.variable should be other.variable
true
}
case _ => false
}
}
Какой из них работает. Другой вариант состоит в том, чтобы реализовать свойство равенства в == во всех местах «должно быть», а в случае, если оно ложно в одном месте, возвращает false, иначе true. Проблема в том, что при запуске теста я получаю сообщение об ошибке, что оба объекта «Пример» не равны (если они нет), но я хотел бы видеть, в каком элементе они отличаются.
Как это достичь?
Благодарим за помощь!
[UPDATE] На практике Пример содержит несколько массивов и другие поля, поэтому я изменил код.
Спасибо за ваш ответ, я рассмотрел это, но отклонил, потому что у меня есть несколько полей (например, 10) в моем классе, и я не хочу писать 10 инструкций для каждой проверки. – DreamFlasher
@DreamFlasher Возможно, я был неясно - не уверен. Я хотел предложить заменить «left.array.length должен быть (other.array.length) для (i <- 0 до left.array.length) { left.array (i) должен быть (other.array (i)) } 'с' left.array должен содержать theSameElementsInOrderAs other.array' –
ах спасибо, теперь это имеет смысл, да, вы правы, я не должен сравнивать элементы самостоятельно, но используйте сравнение массива. Но я до сих пор не ошибаюсь? – DreamFlasher