2017-08-09 38 views
1

使用JUnit 4.12和AndroidStudio当我试图测试方法如下结果在哪里似乎要匹配,我不知道为什么作为reesult我正在下试 java.lang.AssertionError的JUnit测试Asse田SimpleDateFormat的

方法:

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

我的测试类:

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 

我不知道它为什么失败。任何人都会如此敬爱地指点我正确的方向吗?

+0

题外话:固定字符串应该是预期的,得到的字符串应该是真实的。 – Egl

+0

@Egl - 这是非常真实的。感谢您指出。这是我的第一次测试类。 – cheeroke

回答

1

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

如果您想检查它们是否具有相同的内容,则应该使用assertEquals。

+0

救了我一天,谢谢。 – cheeroke

1

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

1

尽管您的逻辑正确,但您在测试中使用了错误的断言。 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

+0

感谢您的解释,我在@Egl发布他的答案时意识到了这一点。 – cheeroke