2015-10-06 91 views
0

我正在閱讀J. Bloch的有效Java並需要刷新equals/hashCode合同和關係。測試重寫等於方法

我有以下的JavaBean類:

public class MyJavaBean{ 

    private int id; 

    private Properties fItem; //Enumeration type 

    private String value; 

    private Rule rule;   //Enumeration type 

    private int fId; 

    //GET, SET 

     @Override 
    public boolean equals(Object o){ 
     if(!(o instanceof MyJavaBean)) 
      return false; 
     MyJavaBeanv = (MyJavaBean) o; 
     return (fItem == null ? v.fItem == null : fItem.equals(v.fItem)) && 
       (value == null ? v.value == null : value.equals(v.value)) && 
       (rule == null ? v.rule == null : rule.equals(v.rule)) && 
       fId == v.fId && id == v.id; 
    } 

    @Override 
    public int hashCode(){ 
     int result = 17; 
     if(fItem != null) 
      result = 31 * result + fItem.hashCode(); 
     if(value != null) 
      result = 31 * result + value.hashCode(); 
     if(rule != null) 
      result = 31 * result + rule.hashCode(); 
     result = 31 * result + fId; 
     result = 31 * result + id; 
     return result; 
    } 
} 

他還建議我們寫單元測試,以確保合同實際上是滿意的。這就是他所說的(斜體粗體強調雷):

當你寫完你的equals方法,問自己三個 問題:它是對稱的?它是傳遞性的嗎?它一致嗎?和 不只是問問自己; 編寫單元測試檢查這些 屬性是否成立!

所以,我無法想象如何爲這個非常簡單的情況編寫單元測試。好吧,我會寫這樣的事情:

public class MyTest{ 

    //Each pair consists of the equals object 
    private Map<MyJavaBean, MyJavaBean> equalValueMap; 

    @Before 
    public void init(){ 
     //initializing the map, using ThredLocalRandom 
     //to get ints and enums randomly 
    } 

    @Test 
    public void testReflexive(){ 
     for(MyJavaBean fiv: equalValueMap.keySet()){ 
      Assert.assertEquals(fiv.equals(fiv), true); 
     } 
    } 

    @Test 
    public void testSymmetric(){ 
     for(MyJavaBean fiv: equalValueMap.keySet()){ 
      Assert.assertEquals(equalValueMap.get(fiv).equals(fiv), true); 
      Assert.assertEquals(fiv.equals(equalValueMap.get(fiv)), true); 
     } 
    } 

    @Test 
    public void testHashCode(){ 
     for(FilterItemValue fiv: equalFilterValueMap.keySet()){ 
      Assert.assertEquals(equalFilterValueMap.get(fiv).hashCode(), fiv.hashCode()); 
     } 
    } 
} 

但我認爲這樣的測試只是浪費構建時,因其簡單而意義。爲簡單的JavaBeans的方法編寫測試值得嗎?

回答

2

恕我直言,如果它們是由您信任的IDE /一些幫助庫生成的,那麼您可以安全地跳過equals()hashCode()的測試。儘管如果你真的在做一些複雜的事情並且擔心這些方法在運行時可能不會像預期的那樣運行,那麼花時間寫一個簡單的測試可能是值得的。