我打算編寫一個抽象類類的東西來測試我所有的DTO和DOMAIN對象。該類將採用模板對象(泛型),並使用反射來獲取屬性的類型,並將一些默認值分配給所標識的基本類型,稍後將通過訪問它們來聲明這些類型值。這樣,每當我的DTO測試繼承這個類時,大部分代碼都會在測試中寫入一行代碼進行測試。這只是一個想法,並且想知道如果我已經存在這樣的事情,我是否重新發明了車輪?如果有更好的方式來測試DTO和域對象的代碼少且可重用。單元測試dto和域對象
回答
我不認爲這是測試Domain對象的好方法。根據定義,這些對象封裝了數據和相關的行爲,他們認爲它們不僅僅是具有getter和setter的啞數據容器。你將不得不手寫這些對象的單元測試,就像你自己手寫對象一樣。根據DDD,這是你實際上想花費時間的地方。
關於DTO你可能想看看這個question。
我同意域對象測試。還有一個小問題。如果我的Domain對象很少只是get/set,它們也可以用作DTO。我可以使用域對象作爲dto用於我的web服務的不同情況。 – user1383012
我不會將域對象用作DTO,因爲它會將Web服務使用者連接到您的域對象。當您想要在不影響Web服務客戶端的情況下發展您的域時,這會造成問題。 – Dmitry
我的建議是:
不要單元測試DTO的。這些只是簡單的數據結構,帶有一堆getter和setter並且沒有行爲。 Getter和setter對於測試來說太愚蠢了(除非它們封裝了DTO很少出現的某種條件邏輯)。
不要嘗試自動化或泛化您的域對象測試。我無法看到測試其行爲的代碼是如何被重用的,因爲它們都有不同的定義。
即使我認爲這是一種不值錢的單元測試的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);
}
}
- 1. 單元測試域對象
- 2. 是否有單元測試庫通過反射聲明dto域對象「相等」?
- 3. 單元測試值對象
- 4. 單元測試對象
- 5. Qt,單元測試和模擬對象
- 6. 單元測試WCF對域對象的響應
- 7. MVC2路線區域和單元測試
- 8. Grails的單元測試域對象列表功能
- 9. 領域單元測試
- 10. 單元測試 - 會話對象?
- 11. 單元測試:修補的對象__base__
- 12. 單元測試Sharepoint對象UserProfileManager
- 13. 創建對象的單元測試
- 14. 單元測試包裝對象?
- 15. 單元測試中的對象比較
- 16. 單元測試 - 如何快照對象?
- 17. 單元測試複雜對象圖
- 18. 使用PHPUnit單元測試Doctrine對象
- 19. Mock對象,而單元測試
- 20. 單元測試的臨時對象池?
- 21. 單元測試對象創建
- 22. 單元測試:測試父對象方法有意義嗎?
- 23. 茉莉單元測試 - 測試的對象
- 24. 如何將DTO轉換爲域對象
- 25. 從域對象構建DTO的設計
- 26. 將部分DTO映射回域對象
- 27. 性能測試對戰單元測試
- 28. CXF測試對單元測試
- 29. 應該爲簡單的POCO域對象編寫哪些單元測試?
- 30. 通過單元測試和單元的Mockito和測試的Mockito
如果我理解正確的,你嘗試,如果映射測試在domainobject和dto之間是完整的,即沒有屬性丟失/丟失。如果您將編程語言添加到您的問題中,可能已經有解決方案。從我的經驗來看,如果你有很多dtos(> 20),它唯一的價值就是它的價值。您的testapi必須考慮要從轉換中排除的屬性以及可能不同的集合順序 – k3b
您應該測試行爲,而不是數據結構...... DTO是數據結構,您只需測試用一些行爲修改其狀態的聚合方法(驗證,如果,規則),它是毫無價值的測試'set'方法...也許最好使用像lombok項目這樣的庫來生成它們,如果你覺得需要測試它們... – rascio