2010-05-21 103 views
0

比較整個對象是否有很好的框架?bean比較的單元測試框架

我現在

assertEquals("[email protected]", obj.email); 
assertEquals("5", obj.shop); 

如果壞了電子郵件返回我從來沒有知道是否有合適的店鋪,我想獲得不正確的字段列表。

+0

重複:http://stackoverflow.com/questions/1411612/how-to-test-for-equality-of-complex-object-graphs – skaffman 2010-05-21 12:39:05

+0

我的目標是簡單;) – IAdapter 2010-05-21 13:11:48

回答

1

與1測試一樣,如果每個斷言都在自己的測試中,你會知道如果其中一個或兩個失敗的原因是1或2個失敗測試失敗。

@Test 
public void TestEmail() 
{ 
    obj = GetTestObject(); 
    assertEquals("[email protected]", obj.email); 
} 

@Test 
public void TestShop() 
{ 
    obj = GetTestObject(); 
    assertEquals("5", obj.shop); 
} 

顯然,你需要的對象設置進入的方法OT有它在測試設置方法進行,並把它一類變量。

如果你真的想測試,如果所有屬性都在一個單一的測試設置:

@Test 
public void TestAllProperties() 
{ 
    obj = GetTestObject(); 
    bool testResult=true; 
    string failureString; 
    if "[email protected]".equals(obj.email) == false 
    { 
     testResult=false; 
     failureString+="email was different"; 
    } 
    if "5".equals(obj.shop) == false 
    { 
     testResult=false; 
     failureString+="shop was different"; 
    } 
    assertTrue(testResult,failurestring); 
} 

,但我不知道這是什麼使你真的。

但是,如果你真的想比較整個對象的相等性,那麼重寫equals方法(不要忘記getHashCode),並在那裏做相等檢查。畢竟這是什麼...

如果你想要一個不正確的字段列表,你可以使等於方法填充內部列表,你可以查詢如果相等性檢查失敗,獲取失敗的字段列表最後一次平等被檢查。不過,真的不認爲這是一個好主意。

0

如果你想測試對象的平等,那麼你一定需要實現使用的assertEquals(equals()和測試),但除此之外,薩姆是正確的,每個測試

1

我會去hamcrest的匹配。他們讓我寫這樣的代碼:

assertThat(obj, hasProperty("email", equalTo("[email protected]"))); 
+1

我個人不喜歡hamcrest。對我來說,它看起來像沒用的文字。爲什麼不只是assertEquals(obj.getEmail(),「[email protected]」);它更短!對我來說,它看起來像編寫額外的代碼(加上靜態導入!)。 – IAdapter 2011-03-30 16:27:51

+0

有很多原因,爲什麼hamcrest不是無用的文本=) 首先你的*意圖*更清潔,那麼當它失敗而不是通用的「AssertionError」時,你會得到一個有意義的錯誤,最重要的是它擴展! – atamur 2011-03-31 06:54:50

+0

有意義的錯誤聽起來很酷且可擴展。我會研究它,thx :) – IAdapter 2011-03-31 11:16:17