2012-05-08 58 views
3

我打算編寫一個抽象類類的東西來測試我所有的DTO和DOMAIN對象。該類將採用模板對象(泛型),並使用反射來獲取屬性的類型,並將一些默認值分配給所標識的基本類型,稍後將通過訪問它們來聲明這些類型值。這樣,每當我的DTO測試繼承這個類時,大部分代碼都會在測試中寫入一行代碼進行測試。這只是一個想法,並且想知道如果我已經存在這樣的事情,我是否重新發明了車輪?如果有更好的方式來測試DTO和域對象的代碼少且可重用。單元測試dto和域對象

+2

如果我理解正確的,你嘗試,如果映射測試在domainobject和dto之間是完整的,即沒有屬性丟失/丟失。如果您將編程語言添加到您的問題中,可能已經有解決方案。從我的經驗來看,如果你有很多dtos(> 20),它唯一的價值就是它的價值。您的testapi必須考慮要從轉換中排除的屬性以及可能不同的集合順序 – k3b

+0

您應該測試行爲,而不是數據結構...... DTO是數據結構,您只需測試用一些行爲修改其狀態的聚合方法(驗證,如果,規則),它是毫無價值的測試'set'方法...也許最好使用像lombok項目這樣的庫來生成它們,如果你覺得需要測試它們... – rascio

回答

3

我不認爲這是測試Domain對象的好方法。根據定義,這些對象封裝了數據和相關的行爲,他們認爲它們不僅僅是具有getter和setter的啞數據容器。你將不得不手寫這些對象的單元測試,就像你自己手寫對象一樣。根據DDD,這是你實際上想花費時間的地方。

關於DTO你可能想看看這個question

+0

我同意域對象測試。還有一個小問題。如果我的Domain對象很少只是get/set,它們也可以用作DTO。我可以使用域對象作爲dto用於我的web服務的不同情況。 – user1383012

+0

我不會將域對象用作DTO,因爲它會將Web服務使用者連接到您的域對象。當您想要在不影響Web服務客戶端的情況下發展您的域時,這會造成問題。 – Dmitry

1

我的建議是:

  • 不要單元測試DTO的。這些只是簡單的數據結構,帶有一堆getter和setter並且沒有行爲。 Getter和setter對於測試來說太愚蠢了(除非它們封裝了DTO很少出現的某種條件邏輯)。

  • 不要嘗試自動化或泛化您的域對象測試。我無法看到測試其行爲的代碼是如何被重用的,因爲它們都有不同的定義。

1

即使我認爲這是一種不值錢的單元測試的DTO的基礎上,@德米特里的答案,我想出了這個類:

[TestClass] 
public class PeopleTest 
{ 
    [TestMethod] 
    public void OneObjectNull() 
    { 
     Person obj1 = null; 
     var obj2 = new Person 
     { 
      Id = "101", 
      Name = "George Waits", 
      Address = "Lake Palmer 10" 
     }; 

     Assert.AreNotEqual(obj1, obj2); 
     Assert.AreNotEqual(obj2, obj1); 
    } 

    [TestMethod] 
    public void DeepEqual() 
    { 
     var obj1 = new Person 
     { 
      Id = "101", 
      Name = "George Waits", 
      Address = "Lake Palmer 10" 
     }; 

     var peolpleList1 = new List<Person> { obj1 }; 
     var peolpleList2 = new List<Person> { obj1 }; 

     Assert.AreEqual(obj1, obj1); 
     CollectionAssert.AreEqual(peolpleList1, peolpleList2); 
    } 

    [TestMethod] 
    public void DeepNotEqual() 
    { 
     var obj1 = new Person 
     { 
      Id = "101", 
      Name = "George Waits", 
      Address = "Lake Palmer 10" 
     }; 

     var obj2 = new Person 
     { 
      Id = "102", 
      Name = "Rachel Smith", 
      Address = "Lake Palmer 10" 
     }; 

     var peolpleList1 = new List<Person> { obj1 }; 
     var peolpleList2 = new List<Person> { obj2 }; 

     Assert.AreNotEqual(peolpleList1, peolpleList2); 

     var group1 = new KeyValuePair<string, List<Person>>("group1", peolpleList1); 
     var group2 = new KeyValuePair<string, List<Person>>("group2", peolpleList2); 

     Assert.AreNotEqual(group1, group2); 
    } 

    [TestMethod] 
    public void PropertyPositive() 
    { 
     var obj1 = new Person 
     { 
      Id = "101", 
      Name = "George Waits", 
      Address = "Lake Palmer 10" 
     }; 
     obj1.Address = "Parker av 101"; 

     var obj2 = new Person 
     { 
      Id = "102", 
      Name = "Rachel Smith", 
      Address = "Lake Palmer 10" 
     }; 
     obj1.Address = "Listener av 45"; 

     Assert.AreNotEqual(obj1, obj2); 
    } 
}