簡體   English   中英

單元測試 - AssertionFailedError - Java

[英]Unit Testing - AssertionFailedError - Java

我無法理解為什么這個單元測試不起作用。 我正在創建 @RegionWithActivities 的兩個實例,我認為它應該通過測試。

    @Test
    void testAreEqual()
    {
        RegionWithActivities regionWithActivities1 = new RegionWithActivities(4, regions);
        RegionWithActivities regionWithActivities2 = new RegionWithActivities(4, regions);

        assertEquals(regionWithActivities1, regionWithActivities2);
    }

錯誤是:

org.opentest4j.AssertionFailedError: expected: com.luciaandres.analysis.RegionWithActivities@710726a3<RegionWithActivities{numberOfActivities=4, regionIds=[4DA19B2B1328127FC062FB79F6F435A5, B66FA66DA650717E0964A4E30A716DAE, C841C0BED1CCDD643955065A696EED34, F2D04F76EA1EBD6C8E3AEDD506FBA35A]}> but was: com.luciaandres.analysis.RegionWithActivities@646007f4<RegionWithActivities{numberOfActivities=4, regionIds=[4DA19B2B1328127FC062FB79F6F435A5, B66FA66DA650717E0964A4E30A716DAE, C841C0BED1CCDD643955065A696EED34, F2D04F76EA1EBD6C8E3AEDD506FBA35A]}>
Expected :RegionWithActivities{numberOfActivities=4, regionIds=[4DA19B2B1328127FC062FB79F6F435A5, B66FA66DA650717E0964A4E30A716DAE, C841C0BED1CCDD643955065A696EED34, F2D04F76EA1EBD6C8E3AEDD506FBA35A]}
Actual   :RegionWithActivities{numberOfActivities=4, regionIds=[4DA19B2B1328127FC062FB79F6F435A5, B66FA66DA650717E0964A4E30A716DAE, C841C0BED1CCDD643955065A696EED34, F2D04F76EA1EBD6C8E3AEDD506FBA35A]}


    at RegionWithActivitiesTest.testAreEqual(RegionWithActivitiesTest.java:29)
    at java.base/java.util.ArrayList.forEach(ArrayList.java:1507)
    at java.base/java.util.ArrayList.forEach(ArrayList.java:1507)

你能解釋一下嗎? 謝謝!

當您使用 assertEquals 時,它會嘗試使用 equals() 方法比較兩個對象。如果您沒有在類中覆蓋 Object 類中的 equals() 方法,它將使用 Object 類中的默認 equals() 方法,其實現如下:

public boolean equals(Object obj) {
       return (this == obj);    
}

如您所見,這里只是比較對象引用,並且因為在您的情況下兩個對象有兩個不同的引用,所以斷言失敗,因此您需要在 RegionWithActivities 類中實現 equals() 方法,並作為重寫 equals() 時的最佳實踐),您也應該覆蓋 hashcode() 方法,但您的斷言沒有必要通過。

理論上,可以只在RegionWithActivities實現equals以使您的測試用例作為基於RegionWithActivities equals()assertEquals斷言通過。 但是僅實現equals()而沒有實現hashcode()將紫羅蘭色對象類合同2 如下所述-

hashCode 的總合約為:

  1. 在 Java 應用程序執行期間,只要在同一個對象上多次調用它,hashCode 方法必須始終返回相同的整數,前提是在對象的 equals 比較中使用的信息沒有被修改。 該整數不需要從應用程序的一次執行到同一應用程序的另一次執行保持一致。
  2. 如果根據 equals(Object) 方法兩個對象相等,則對兩個對象中的每一個調用 hashCode 方法必須產生相同的整數結果。
  3. 如果根據 equals(java.lang.Object) 方法兩個對象不相等,則不需要對兩個對象中的每一個調用 hashCode 方法必須產生不同的整數結果。 但是,程序員應該意識到為不相等的對象生成不同的整數結果可能會提高哈希表的性能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM