scala - 单元测试无法得到预期结果,代码如下
问题描述
这是我的代码,它将日期时间转换为纪元时间戳。逻辑是如果时间是本地日期时间,那么做某事,否则,做某事。成功案例效果不错
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' could not be parsed at index 19”,为什么我不能得到 JNothing?如何解决这个错误?</p>
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
}
解决方案
具体问题是异常被抛出在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
}
推荐阅读
- python-3.x - seaborn 没有按预期绘制散点图
- java - 有没有更好的方法来解析大型 Android 应用的字符串资源?
- google-apps-script - 同步 Google 表格和 Google 日历时如何解决重复问题
- django - ModuleNotFound 错误尝试在 Heroku 中打开 Django 应用程序 - gunicorn 设置问题?
- reactjs - 在反应中测试组件
- java - 将列动态添加到 JTable 时覆盖 TableCellRenderer?
- sql - 从表中删除记录而不影响关联表
- .net - 您知道在 Windows 10 Home 上的 IIS 中调试时如何解决此错误吗?
- c# - 无法创建 DbContext
- c# - 将 Grapevine (5.0.0-rc.7) 导入 NuGetForUnity 中未显示的 Unity 项目/NuGet 包