你能解释为什么这些单元测试失败吗? 代码似乎非常明显,甚至失败结果也显示相同。
@Test
public void getFormatedDate() {
Date date = new Date();
assertEquals(date, dateRestService.getFormatedDate(date));
}
控制台日志是:
java.lang.AssertionError: expected: java.util.Date<Sun Jan 07 17:06:05 CET 2018> but was: java.util.Date<Sun Jan 07 17:06:05 CET 2018>
Expected :java.util.Date<Sun Jan 07 17:06:05 CET 2018>
Actual :java.util.Date<Sun Jan 07 17:06:05 CET 2018>
获取格式化日期如预期:
@Override
public Date getFormatedDate(Date dateToBeFormated) {
dateToBeFormated = date.getDate();
dateToBeFormated = Calendar.getInstance().getTime();
return dateToBeFormated;
}
在您的代码中,您在不同的时刻实例化两个 Date 对象,因此它们应该是不同的。可能它们有不同的毫秒,在格式化日期时可能看不到。要断言您的方法返回今天的日期值,您可能需要按归档、断言年、月、日、小时、分钟和秒检查字段。
你的getFormatedDate
函数应该更像这样:
public static String getFormatedDate(Date inDate) {
SimpleDateFormat format = new SimpleDateFormat("E MMM dd HH:mm:ss z Y", Locale.ENGLISH);
String dateString = format.format(inDate);
return dateString;
}
当给定编写此答案的当前时间时,它将返回"Sun Jan 07 14:50:16 EST 2018",这似乎是您的断言所期望的格式。
tl;博士
instant.equals( Instant.now() ) // Capture the current moment with a resolution as fine as nanoseconds, and compare.
秒的小数部分
你对Calendar
的呼唤正在捕捉另一个时刻,一个比过去的Date
更晚的时刻。两者都以毫秒的分辨率捕获当前时刻。因此,虽然它们可能都捕获相同的秒数,但小数秒可能会有所不同或可能相同,具体取决于计算机的速度。您正在生成一个仅显示整秒的字符串,因此会掩盖秒的小数部分的任何差异。
java.time
您正在使用麻烦的旧日期时间类,这些类现在是遗留的,被现代的java.time类所取代。
纳 秒
在 Java 9 及更高版本中,以 UTC 格式捕获当前时刻作为Instant
,其分辨率精确到纳秒,具体取决于硬件时钟的功能。特别是在Java 8中,当前时刻的捕获仅精确到毫秒,Java 9中被替换的较旧的Clock
实现。
Instant instant = Instant.now() ;
使用对象,而不是字符串
直接比较对象,而不是字符串。
boolean isEqual = instant.equals( Instant.now() ) ; // Likely FALSE.
ISO 8601
认证 要生成要显示给人类的字符串,请调用toString
以获取标准 ISO 8601 格式的文本,其中包含显示当前值所需的小数位数。所以没有隐藏的数据。
String output = instant.toString() ; Generate String in standard ISO 8601 format.
2018-01-23T01:23:45.123456Z