我计划编写一个类似抽象类的东西,用于测试所有DTO和DOMAIN对象。这个类将接收可模板化对象(泛型),并使用反射获取其内部属性的类型,并为识别出来的基本类型分配一些默认值,稍后通过访问它们来断言这些类型的值。这样,每当我的DTO测试继承此类时,大部分代码都可以通过在测试中编写一行代码进行测试。这只是一个想法,我想知道你们是否认为我正在重新发明轮子,是否已经存在类似的东西?如果有更好的方法来测试DTO和域对象,可以用更少且可重复使用的代码来实现吗?
我的建议:
不要对DTO进行单元测试。这些只是简单的数据结构,具有一堆getter和setter,没有任何行为。getter和setter太过简单,无需进行测试(除非它们封装了某种条件逻辑,但这在DTO中很少出现)。
不要尝试自动化或泛化您的领域对象测试。我看不出测试它们的行为的代码如何被重用,因为它们按定义都具有不同的行为。
虽然我认为对DTO进行单元测试有点毫无意义,但基于@Dmitry的答案,我想出了这个类:
[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);
}
}
set
方法是没有意义的...如果你觉得有必要测试它们,也许最好使用像 Project Lombok 这样的库来生成它们... - rascio