利用XmlSerializer在测试环境判断两个对象值相等
2007-08-10 11:28
381 查看
我的第一篇博客,嘿嘿
在UnitTest中经常会用到Assert.AreEqual
但是AreEqual对引用类型来说是判断地址是否相等,而不是该对象的所有字段是否一一相等
于是我们需要判断值相等时,要么在UnitTest中对两个对象的所有字段一一比较,要么重写equals方法,对字段进行一一比较
无论是哪种方式,都要对每个字段比较一遍,比较麻烦
今天写着写着写烦了,就想找个省事点的方法,于是就有了本文的内容
一般来说我们要比较的对象,都是自己定义的Entity/Model,里面有大量的本身就是Serializable的Properties
就想到如果标记这个Entity为Serializable,用XmlSerializer序列化该对象,并比较序列化之后两个XmlDocument的InnerXml
这样就省去了先前的麻烦,日后如果增加/减少字段,也不用更改代码。
加上DEBUG标签,在测试阶段使用,也不会对实际环境造成性能和逻辑的影响
如果程序中有些地方需要用到ReferenceEquals
那么可以把那段代码当作Tools放在UnitTest工程里,而不是重写Equals
代码如下,不知道大家有没有其他的好办法。
1 [Serializable]
2 public abstract class EntityBase
3 {
4#if DEBUG
5 public override bool Equals(object right)
6 {
7 if (right == null)
8 return false;
9 if (object.ReferenceEquals(this, right))
10 return true;
11 if (this.GetType() != right.GetType())
12 return false;
13
14 XmlDocument leftXml = Serialize(this);
15 XmlDocument rightXml = Serialize(right);
16
17 return leftXml.InnerXml == rightXml.InnerXml;
18 }
19
20 private XmlDocument Serialize(object obj)
21 {
22 using (MemoryStream stream = new MemoryStream())
23 {
24 XmlDocument doc = new XmlDocument();
25 XmlSerializer serializer = new XmlSerializer(obj.GetType());
26 serializer.Serialize(stream, obj);
27 stream.Seek(0, SeekOrigin.Begin);
28 doc.Load(stream);
29
30 return doc;
31 }
32 }
33
34 public override int GetHashCode()
35 {
36 return base.GetHashCode();
37 }
38#endif
39 }
在UnitTest中经常会用到Assert.AreEqual
但是AreEqual对引用类型来说是判断地址是否相等,而不是该对象的所有字段是否一一相等
于是我们需要判断值相等时,要么在UnitTest中对两个对象的所有字段一一比较,要么重写equals方法,对字段进行一一比较
无论是哪种方式,都要对每个字段比较一遍,比较麻烦
今天写着写着写烦了,就想找个省事点的方法,于是就有了本文的内容
一般来说我们要比较的对象,都是自己定义的Entity/Model,里面有大量的本身就是Serializable的Properties
就想到如果标记这个Entity为Serializable,用XmlSerializer序列化该对象,并比较序列化之后两个XmlDocument的InnerXml
这样就省去了先前的麻烦,日后如果增加/减少字段,也不用更改代码。
加上DEBUG标签,在测试阶段使用,也不会对实际环境造成性能和逻辑的影响
如果程序中有些地方需要用到ReferenceEquals
那么可以把那段代码当作Tools放在UnitTest工程里,而不是重写Equals
代码如下,不知道大家有没有其他的好办法。
1 [Serializable]
2 public abstract class EntityBase
3 {
4#if DEBUG
5 public override bool Equals(object right)
6 {
7 if (right == null)
8 return false;
9 if (object.ReferenceEquals(this, right))
10 return true;
11 if (this.GetType() != right.GetType())
12 return false;
13
14 XmlDocument leftXml = Serialize(this);
15 XmlDocument rightXml = Serialize(right);
16
17 return leftXml.InnerXml == rightXml.InnerXml;
18 }
19
20 private XmlDocument Serialize(object obj)
21 {
22 using (MemoryStream stream = new MemoryStream())
23 {
24 XmlDocument doc = new XmlDocument();
25 XmlSerializer serializer = new XmlSerializer(obj.GetType());
26 serializer.Serialize(stream, obj);
27 stream.Seek(0, SeekOrigin.Begin);
28 doc.Load(stream);
29
30 return doc;
31 }
32 }
33
34 public override int GetHashCode()
35 {
36 return base.GetHashCode();
37 }
38#endif
39 }
相关文章推荐
- java怎么判断两个Set 里的对象的值是否相同【两个set中的值是否相等】、java treeset和hashset如何判断元素是否相同【即对象是否完全相同;利用一个set去除重复元素】
- 判断两个对象是否相等的js函数
- 判断两个对象是否相等,为什么必须同时重写equals()和hashcode()方法
- List集合判断两个对象相等的标准
- [AS3]判断两个对象是否相等
- 判断两个对象内容相等与equals方法
- 判断两个对象是否相等
- 判断两个对象是否相等,为什么必须同时重写equals()和hashcode()方法
- 判断java中两个对象是否相等
- c#如何判断两个对象是否相等
- List、Set、Map判断两个对象相等的标准
- 判断java中两个对象是否相等
- 判断两个对象是否相等的js函数
- 学习体会:在JAVA中如何判断两个对象是否相等
- 判断两个对象是否相等
- JS判断两个对象内容是否相等的方法示例
- 在java的集合中是怎么判断两个对象是否相等的?(重要!)
- 判断两个对象相等 和重写equals、 hashcode
- 判断两个对象相等的工具类
- Java中判断两个对象是否相等