Сравнение OffsetDateTime с отметкой времени в ScalaTest - PullRequest
0 голосов
/ 21 июня 2019

Я довольно новичок в мире Scala

В моих тестах Scala у меня есть java.time.OffsetDateTime и java.sql.Timestamp

offsetDateTimeValue shouldBe timestampValue

Результат:

Expected :2019-06-20T16:19:57.988Z
Actual   :2019-06-20 16:19:57.988

Есть идеи?Я думал о реализации пользовательского сопоставления, но застрял с этим

Ответы [ 3 ]

2 голосов
/ 21 июня 2019

Настраиваемое решение равенства -

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].

2 голосов
/ 22 июня 2019

В итоге я реализовал пользовательское сопоставление, так как оно было нужно во многих тестах

def beTheSameDate(right: OffsetDateTime) = DateTestMatcher(right)

case class DateTestMatcher(right: OffsetDateTime) extends Matcher[Timestamp] {
  override def apply(left: Timestamp): MatchResult = {
    val areEqual = left.toLocalDateTime == right.toLocalDateTime
    MatchResult(areEqual, "Dates are not equal", "Dates are equal")
  }

А потом

timestampValue should beTheSameDate(offsetDateTimeValue)
2 голосов
/ 21 июня 2019

Попробуйте преобразовать их обоих в Long значение, например,

val expected = OffsetDateTime.parse(offsetDateTimeValue, DateTimeFormatter.ISO_OFFSET_DATE_TIME).toInstant.toEpochMilli
val actual = timestampValue.toInstant(ZoneOffset.UTC).toEpochMilli
expected shouldBe actual
...