Java Date测试失败 - 相同但没有

时间:2018-01-07 16:08:58

标签: java unit-testing junit mockito

你可以解释一下为什么那些单元测试失败了吗? 代码似乎非常明显,甚至失败结果都显示相同。

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;

}
按预期

getFormatedDate:

getSymbols

3 个答案:

答案 0 :(得分:0)

您的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; 
}

当给出这个答案的当前时间时,它返回&#34; Sun Jan 07 14:50:16 EST 2018&#34;,这似乎是你的断言期望的格式。

答案 1 :(得分:0)

TL;博士

instant.equals( Instant.now() )   // Capture the current moment with a resolution as fine as nanoseconds, and compare. 

小数秒

您对Calendar的通话正在捕捉与通过的Date相关的另一个时刻。两者都以毫秒的分辨率捕获当前时刻。因此,虽然它们都可能捕获相同的秒数,但小数秒可能不同,或者可能相同,具体取决于计算机的速度。您正在生成一个仅显示整秒的字符串,因此会屏蔽小数秒的任何差异。

java.time

你正在使用现在遗留的麻烦的旧日期时间类,取而代之的是现代java.time类。

纳秒

以UTC为Instant捕获当前时刻,分辨率为纳秒,具体取决于硬件时钟的功能,在Java 9及更高版本中。特别是在Java 8中,当前时刻的捕获时间仅为毫秒,而{9}中较早的实现已在Java 9中被替换。

Clock

使用对象,而不是字符串

直接比较对象,而不是字符串。

Instant instant = Instant.now() ;

ISO 8601

要生成用于向人类显示的字符串,请为标准ISO 8601格式的文本调用boolean isEqual = instant.equals( Instant.now() ) ; // Likely FALSE. ,并根据需要使用小数部分中的多位数来显示当前值。所以没有隐藏的数据。

toString
  

2018-01-23T01:23:45.123456Z

答案 2 :(得分:-1)

在您的代码中,您正在不同时刻实例化两个Date对象,因此它们应该是不同的。可能它们具有不同的毫秒数,在格式化日期时可能看不到。要声明您的方法返回今天的日期值,您可能需要按字段检查字段,断言年,月,日,小时,分钟和秒。