Настраиваемое решение равенства -
implicit val timeEquality : Equality[OffsetDateTime] = (a: OffsetDateTime, b: Any) => b match {
case timestamp: Timestamp => a.toInstant == timestamp.toInstant // can also go via epoch milliseconds as per Mario's solution
case other => a == other
}
val instant = Instant.now()
val offset = OffsetDateTime.ofInstant(instant, ZoneId.of("UTC"))
val timestamp = Timestamp.from(instant)
offset shouldEqual timestamp // test passes
Использование equal
/ shouldEqual
вместо be
позволяет настроить равенство, используемое средством сопоставления, путем реализации Equality
и передачи его в качестве неявногопараметр.Если вам не нравится неявное, вы также можете передать его явно:
val timesBeingEqual: Equality[OffsetDateTime] = ...
(offset shouldEqual timestamp)(decided by timesBeingEqual)
Если у вас есть куча временных тестов, этот подход избавляет вас от необходимости каждый раз конвертировать.Основным недостатком является то, что вы, очевидно, не можете выборочно переопределить равенство только в том случае, если вы сравниваете с меткой времени, и если вы хотите выполнить сравнение наоборот, вам также придется реализоватьEquality[Timestamp]
.