對對象進行Assert

在單元測試中面氓,當期望結果(Expect)和實際結果(Actual)都是對象時,進行Assert.assertEquals判斷時衫画,可能會不符合預期睡榆,我們認為符合預期的測試結果還是失敗场航,
主要還是對象equals比較不等導致的缠导。

原因分析

如果選用junit框架,當調用Assert.assertEquals(expected, actual)溉痢,最終會
調用對象當equals方法:

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

我們知道僻造,Object是所有類的父類憋他,其equals方法實現(xiàn)

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

這就引出另一個問題,equals如何比較髓削,equals和=有何不同竹挡?
this 和 obj都是對象的引用,也就是對于任何非空的參考值x和y 立膛,當且僅當x和y引用相同的對象( x == y具有值true )時揪罕,該方法返回true 。

解決方法

重寫對象的equals方法宝泵。參見jdk官方文檔好啰,為了避免重寫equals方法引入該對象的其它操作漏洞,一定要實現(xiàn)等價關系儿奶。
public boolean equals(Object obj)

 equals方法在非空對象引用上實現(xiàn)等價關系:
 自反性 :對于任何非空的參考值x 框往,x.equals(x)應該返回true 。
 對稱性 :對于任何非空引用值x和y 闯捎, x.equals(y)應該返回true當且僅當y.equals(x)回報true 椰弊。
 傳遞性 :對于任何非空引用值x , y和z 隙券,如果x.equals(y)回報true個y.equals(z)回報true 男应,然后x.equals(z)應該返回true 。
 一致性 :對于任何非空引用值x和y 娱仔,多次調用x.equals(y)始終返回true或始終返回false ,沒有設置中使用的信息equals比較上的對象被修改游桩。
 對于任何非空的參考值x 牲迫, x.equals(null)應該返回false 。

請注意借卧,無論何時覆蓋該方法盹憎,通常需要覆蓋hashCode方法,以便維護hashCode方法的通用合同铐刘,該方法規(guī)定相等的對象必須具有相等的哈希碼陪每。

  hashCode的總合同是:
  只要在執(zhí)行Java應用程序時多次在同一個對象上調用該方法, hashCode方法必須始終返回相同的整數(shù)镰吵,前提是修改了對象中equals比較中的信息檩禾。 該整數(shù)不需要從一個應用程序的執(zhí)行到相同應用程序的另一個執(zhí)行保持一致。
  如果根據equals(Object)方法兩個對象相等疤祭,則在兩個對象中的每個對象上調用hashCode方法必須產生相同的整數(shù)結果盼产。
  不要求如果兩個對象根據equals(java.lang.Object)方法不相等,那么在兩個對象中的每個對象上調用hashCode方法必須產生不同的整數(shù)結果勺馆。 但是戏售,程序員應該意識到侨核,為不等對象生成不同的整數(shù)結果可能會提高哈希表的性能。
 盡可能多的合理實用灌灾,由類別Object定義的hashCode方法確實為不同對象返回不同的整數(shù)搓译。 (這通常通過將對象的內部地址轉換為整數(shù)來實現(xiàn),但Java的編程語言不需要此實現(xiàn)技術锋喜。)

哈希沖突是所有哈希函數(shù)無法完全避免的侥衬,只能盡量的減少沖突。所以也無法保證對于不同的對象跑芳,其hashCode完全不同轴总。

具體實現(xiàn)

    @Builder @Setter @Getter
    public static class Tag extends Object {
        private Integer id;
        private String name;
        private float confidence;

        @Override
        public int hashCode() {
            return Objects.hash(this.id, this.name, this.confidence);
        }

        @Override
        public boolean equals(Object obj) {
            if (obj == this) {
                return true;
            }

            if (obj == null) {
                return false;
            }
            Tag tag = (Tag) obj;
            if (tag.getId() == this.id
            && tag.getName().equals(this.name)
            && tag.getConfidence() == this.confidence) {
                return true;
            }
            return false;
        }
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市博个,隨后出現(xiàn)的幾起案子怀樟,更是在濱河造成了極大的恐慌,老刑警劉巖盆佣,帶你破解...
    沈念sama閱讀 221,548評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件往堡,死亡現(xiàn)場離奇詭異,居然都是意外死亡共耍,警方通過查閱死者的電腦和手機虑灰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來痹兜,“玉大人穆咐,你說我怎么就攤上這事∽中瘢” “怎么了对湃?”我有些...
    開封第一講書人閱讀 167,990評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長遗淳。 經常有香客問我拍柒,道長,這世上最難降的妖魔是什么屈暗? 我笑而不...
    開封第一講書人閱讀 59,618評論 1 296
  • 正文 為了忘掉前任拆讯,我火速辦了婚禮,結果婚禮上养叛,老公的妹妹穿的比我還像新娘种呐。我一直安慰自己,他們只是感情好一铅,可當我...
    茶點故事閱讀 68,618評論 6 397
  • 文/花漫 我一把揭開白布陕贮。 她就那樣靜靜地躺著,像睡著了一般潘飘。 火紅的嫁衣襯著肌膚如雪肮之。 梳的紋絲不亂的頭發(fā)上掉缺,一...
    開封第一講書人閱讀 52,246評論 1 308
  • 那天,我揣著相機與錄音戈擒,去河邊找鬼眶明。 笑死,一個胖子當著我的面吹牛筐高,可吹牛的內容都是我干的搜囱。 我是一名探鬼主播,決...
    沈念sama閱讀 40,819評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼柑土,長吁一口氣:“原來是場噩夢啊……” “哼蜀肘!你這毒婦竟也來了?” 一聲冷哼從身側響起稽屏,我...
    開封第一講書人閱讀 39,725評論 0 276
  • 序言:老撾萬榮一對情侶失蹤扮宠,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后狐榔,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體坛增,經...
    沈念sama閱讀 46,268評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,356評論 3 340
  • 正文 我和宋清朗相戀三年薄腻,在試婚紗的時候發(fā)現(xiàn)自己被綠了收捣。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,488評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡庵楷,死狀恐怖罢艾,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情嫁乘,我是刑警寧澤昆婿,帶...
    沈念sama閱讀 36,181評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站蜓斧,受9級特大地震影響,放射性物質發(fā)生泄漏睁冬。R本人自食惡果不足惜挎春,卻給世界環(huán)境...
    茶點故事閱讀 41,862評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望豆拨。 院中可真熱鬧直奋,春花似錦、人聲如沸施禾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,331評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽弥搞。三九已至邮绿,卻和暖如春渠旁,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背船逮。 一陣腳步聲響...
    開封第一講書人閱讀 33,445評論 1 272
  • 我被黑心中介騙來泰國打工顾腊, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人挖胃。 一個月前我還...
    沈念sama閱讀 48,897評論 3 376
  • 正文 我出身青樓杂靶,卻偏偏與公主長得像,于是被迫代替她去往敵國和親酱鸭。 傳聞我的和親對象是個殘疾皇子吗垮,可洞房花燭夜當晚...
    茶點故事閱讀 45,500評論 2 359