2015-10-06 66 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()的测试。尽管如果你真的在做一些复杂的事情并且担心这些方法在运行时可能不会像预期的那样运行,那么花时间写一个简单的测试可能是值得的。