2011-05-19 60 views
21

我創建了一個類並重寫了equals()方法。當我使用assertTrue(obj1.equals(obj2))時,它會通過測試;但是,assertEquals(obj1, obj2)將無法​​通過測試。有人可以告訴原因嗎?JUnit assertEquals()對兩個對象失敗

+2

我們需要看到equals方法的代碼 – hvgotcodes 2011-05-19 15:18:13

+0

'obj1'和'obj2'是同一類型嗎? – 2011-05-19 15:18:39

+0

您是否在調試模式下嘗試使用assertEquals重寫的相等值? – VirtualTroll 2011-05-19 15:19:15

回答

30

我的猜測是,你有沒有實際上覆蓋equals - 你已經超載它來代替。在編譯時使用@Override註釋來找出這種東西。

換句話說,我懷疑你有:

public boolean equals(MyClass other) 

,你應該有:

@Override // Force the compiler to check I'm really overriding something 
public boolean equals(Object other) 

在你的工作斷言,你無疑調用重載方法obj1obj2的編譯時間類型都是MyClass(或不管你的類被稱爲)。 JUnit的assertEquals只會呼叫equals(Object),因爲它不知道更好。

+1

它在我將公共布爾等於(MyClass其他)更改爲公共布爾等於(對象其他)時起作用。謝謝喬恩。 – 2011-05-19 15:33:03

+0

@nikel:'Date'是可變的,這使得很難很好地實現平等 - 你可以有一個'HashSet ',一旦你突變了一個條目,你將無法再找到它...... – 2015-05-13 10:38:15

+0

重新添加評論 - 我想知道爲什麼日期不會覆蓋其等於執行... – nikel 2015-05-13 10:41:34

1

這裏是assertEquals代碼(從Github):

static public void assertEquals(String message, Object expected, 
     Object actual) { 
    if (expected == null && actual == null) 
     return; 
    if (expected != null && isEquals(expected, actual)) 
     return; 
    else if (expected instanceof String && actual instanceof String) { 
     String cleanMessage= message == null ? "" : message; 
     throw new ComparisonFailure(cleanMessage, (String) expected, 
       (String) actual); 
    } else 
     failNotEquals(message, expected, actual); 
} 

private static boolean isEquals(Object expected, Object actual) { 
    return expected.equals(actual); 
} 

我能想到的只有一個情況下這種行爲你描述的方式 - 如果你的equals方法不正確處理攀比null值。

+0

你假設JUnit調用的'equals'與傳入版本中調用的'equals'是一樣的...... – 2011-05-19 15:23:54

+0

@Jon是的,只是注意到你已經正確地猜到了這個問題。 – 2011-05-22 06:52:46