测试 SimpledateFormat 时的 JUnit AssertionError

JUnit AssertionError when testing SimpledateFormat

使用 JUnit 4.12 和 AndroidStudio 我正在尝试测试以下方法结果似乎匹配我不知道为什么我得到了结果 java.lang.AssertionError

正在测试的方法:

public String dateNow() {
    SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy_hh-mm-ss");
    String date = sdf.format(new Date());
    return date;
}

我的测试class :

private Addons mAddons;

@Before
public void setUp() throws Exception{
    mAddons = new Addons();
}

@Test
public void testDateNow() throws Exception {

    final String reality = mAddons.dateNow().substring(0,10);
    final String expected = "09-08-2017";
    assertSame("testDateNow() :", expected, reality);
}

控制台输出:

java.lang.AssertionError: testDateNow() : expected same:<09-08-2017> was not:<09-08-2017>

Expected :09-08-2017
Actual   :09-08-2017

我不知道为什么会失败。有谁愿意为我指明正确的方向吗?

assertSame 检查两个参数是否是同一个对象。他们不是。

如果你想检查它们是否有相同的内容,你应该改用assertEquals。

两个日期的toString()方法打印的是同样的东西,但它们所指的对象可能不同。

虽然您的逻辑是正确的,但您在测试中使用了错误的断言。 documentation for assertSame 表示它断言这两个对象必须引用同一个对象。 这意味着这两个对象必须引用同一个对象。

当您将 reality 分配给字符串 "09-08-2017" 时,变量 reality 现在引用内存中包含值 "09-08-2017" 的对象。

mAddons.dateNow().substring(0,10)生成另一个对象,具有相同的值"09-08-2017",所以expected具有相同的值,但不是引用到内存中的同一个对象。

要断言值相同,您应该使用 assertEquals 来测试值是否相等,而不是引用。

比较 Java 中的字符串时,这是一个非常常见的错误。

我建议您也阅读以下文章:Java String compare