2011-03-16 44 views
5

通常我會發現自己爲getter \ setter,c'tors和Object方法(hashCode,equals和toString)創建了相同的單元測試方法。 我想在Eclipse IDE的幫助下實現這個過程的自動化。 考慮這個例子:使用eclipse模板創建測試用例

public Class Person { 
    private String id; 
    private String name; 

    public Person(String id, String name){ 
    this.id = id; 
    this.name = name; 
    } 

    public String getId() { return id; } 
    public void setId(String id) { 
    this.id = id; 
    } 

    public String getName() { return name; } 
    public void setName(String name) { 
    this.name = name; 
    } 

    @override 
    public int hashCode(){ ... } 
    public boolean equals(Person other){ ... } 
    public String toString(){ ... } 

    /* this class may implement other logic which is irrelevant for the sake of question */ 
} 

單元測試類會是這個樣子:

public class PersonTest extends TestCase 
{ 
    @override 
    public void setup() { 
    Person p1 = new Person("1","Dave"); 
    Person p2 = new Person("2","David"); 
    } 

    @override 
    public void tearDown() { 
    Person p1 = null; 
    Person p2 = null; 
    } 

    public void testGetId() { 
    p1.setId("11"); 
    assertEquals("Incorrect ID: ", "11", p1.getId()); 
    } 

    public void testGetName() { /* same as above */ } 

    public void testEquals_NotEquals() { /* verify that differently initialized instances are not equals */ } 

    public void testEquals_Equals() { /* verify that an object is equals to itself*/ } 

    public void testHashCode_Valid() { /* verify that an object has the same hashcode as a similar object*/ } 

    public void testHashCode_NotValid() { /* verify that different objects has different hashcodes*/ } 

    public void testToString() { /* verify that all properties exist in the output*/ } 
} 

這骨架相似,絕大多數創建的類。 它可以自動化與Eclipse?

回答

11

看看Fast Code。它是一個eclipse插件,它提供了模板材料的非常好的功能,這是你似乎在尋找的東西。在文檔頁面上查找「創建單元測試」部分。

這個插件的一個非常有用的功能是自動創建單元測試。單元測試可以是Junit 3,Junit 4或TestNG類型。對於Junit 4或TestNG測試,適當的註釋將被自動添加。一個需要配置一次。

您還可能發現此Stack Overflow discussion useful

希望有所幫助。

+2

謝謝Nilesh,我會看看 – 2011-03-17 12:32:59

+2

這個插件非常適合創建單元測試。 – javaguy 2011-03-19 20:45:43

1

單元測試旨在顯示對象的行爲符合其預期行爲。它們並不是要確保Java語言正常工作。

你在這裏是一個奇特的數據結構,沒有任何行爲。在這種情況下,每個賦值都是由方法調用調用的,每個解除引用也由方法調用調用。由於面向對象的編程是「數據+行爲」=對象,並且此代碼缺乏行爲,所以它被稱爲非面向對象的代碼。

有時Java使用非面向對象的類來促進信息傳輸。該類確保所有信息在序列化時作爲一個單元傳輸。所以擁有這樣一個類並不代表代碼是錯誤的;然而,如果你遇到這樣的類太多,那麼有些東西是非常錯誤的。

測試的一個關鍵要素是,如果測試不能失敗,那麼測試並不是真正的測試。如果測試不能失敗,那只是忙碌的工作。假設這些字段中的一個不能爲空,那麼setter可能看起來像

public void setName(String name) { 
    if (name == null) throw new IllegalArgumentException("name cannot be null"); 
    this.name = name; 
} 

然後你有東西要測試。否則,您只需檢查賦值運算符是否失敗。順便說一句,如果賦值運算符失敗了,那麼我敢打賭,JVM會很快(而不是晚些時候)很難下載,並且不能相信測試也能正確報告。

+2

埃德溫,我不是故意測試java。在我開始使用它之前它工作得很好...... getters通常是無邏輯的,我可以理解爲什麼不需要檢查它們(除了增加覆蓋率)。但是,對象方法必然會出錯。尤其是equals和hashCode。 c'tor也一樣。有一個單元測試框架,準備了方法存根,javadoc指向測試方法是一個很好的節省時間。我希望能夠獲得現有代碼模板的鏈接,因爲我懷疑這個問題會導致其他問題。 – 2011-03-16 23:18:45

+1

Assaf在說明測試equals和hashCode非常重要時是正確的。這些實施需要確保他們一致地工作,並支持他們各自的合同。 – 2011-03-17 00:58:52

+0

關於'否則,你只是檢查看看賦值操作符是否失敗'語句。實際上,你正在測試setter方法是否編碼正確。很多時候,通過使用IDE代碼生成快捷方式或複製粘貼,即使這些簡單的方法也會被錯誤地編碼。 – 2011-03-17 01:03:21