Модульный тест не может получить ожидаемый результат, код показан ниже - PullRequest
0 голосов
/ 02 мая 2020

Это мой код, который конвертирует время даты в метку времени эпохи. Лог c - это если время локальное, то делай что-нибудь, иначе делай что-нибудь. Случай успеха работает хорошо

time_to_epoch(List(JString("2000-01-01"), JString("yyyy-MM-dd"))) shouldEqual JString("946684800")
time_to_epoch(List(JString("2013-09-29T18:46:19Z"), JString("yyyy-MM-dd'T'HH:mm:ss'Z'"))) shouldEqual JString("1380480379")

Но случаи отказа не могут получить ожидаемый результат, ошибка "java .time.format.DateTimeParseException: Text '2016-06-21-10-19-22' может не может быть проанализирован по индексу 19 ", почему я не могу получить JNothing? Как устранить эту ошибку?

time_to_epoch(List(JString("2016-06-21-10-19-22"), JString("YYYY-MM-dd-hh-mm-ss a"))) shouldEqual JNothing
def time_to_epoch(params: List[JValue]): JValue = params match {

      case _ :: _ :: Nil =>
        time_to_epoch(params ::: List(JString("UTC")))
      case a :: b :: c :: Nil =>

        val jdOpt = for {
          JString(timestamp) <- coerce.toString(a)
          JString(pattern) <- coerce.toString(b)

          formatter = DateTimeFormatter.ofPattern(pattern)
          df = formatter.parseBest(timestamp, LocalDateTime.from(_), LocalDate.from(_))

          jd1 <- if (df.isInstanceOf[LocalDateTime]) {
            val res = df.asInstanceOf[LocalDateTime].toInstant(ZoneOffset.of(String.valueOf(ZoneId.of("UTC").getRules.getOffset(LocalDateTime.now))))
            Try(JString(res.getEpochSecond.toString)).toOption
          } else {
            Try(JString(df.asInstanceOf[LocalDate].atStartOfDay(ZoneId.of("UTC")).toInstant.getEpochSecond.toString)).toOption
          }
        } yield jd1

        jdOpt.getOrElse(JNothing)
      case _ => JNothing
    }

1 Ответ

0 голосов
/ 02 мая 2020

Специфическая проблема c заключается в том, что исключение выдается в parseBest, который находится вне любого Try, поэтому оно не перехватывается.

Использование asInstanceOf также опасно, поэтому вместо него используйте match:

def time_to_epoch(params: List[JValue]): JValue = params match {
  case _ :: _ :: Nil =>
    time_to_epoch(params ::: List(JString("UTC")))
  case JString(timestamp) :: JString(pattern) :: JString(tz) :: Nil =>
    Try {
      val formatter = DateTimeFormatter.ofPattern(pattern)
      val df = formatter.parseBest(timestamp, LocalDateTime.from _, LocalDate.from _)

      df match {
        case ldt: LocalDateTime =>
          val res = ldt.toInstant(ZoneOffset.of(String.valueOf(ZoneId.of(tz).getRules.getOffset(LocalDateTime.now))))
          JString(res.getEpochSecond.toString)
        case ld: LocalDate =>
          JString(ld.atStartOfDay(ZoneId.of(tz)).toInstant.getEpochSecond.toString)
        case _ =>
          JNothing
      }
    }.getOrElse(JNothing)
  case _ =>
    JNothing
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...