ska*_*man 24 java unit-testing
假设我有一个单元测试,想要比较两个复杂的对象是否相等.这些对象包含许多其他深层嵌套的对象.所有对象的类都有正确定义的equals()方法.
这并不困难:
@Test
public void objectEquality() {
Object o1 = ...
Object o2 = ...
assertEquals(o1, o2);
}
Run Code Online (Sandbox Code Playgroud)
麻烦的是,如果对象不相等,你得到的只是失败,没有迹象表明对象图的哪个部分不匹配.调试这可能是痛苦和令人沮丧的.
我目前的方法是确保一切都实现toString(),然后像这样比较相等:
assertEquals(o1.toString(), o2.toString());
Run Code Online (Sandbox Code Playgroud)
这使得更容易追踪测试失败,因为像Eclipse这样的IDE有一个特殊的可视比较器,用于在失败的测试中显示字符串差异.基本上,对象图以文本方式表示,因此您可以看到差异的位置.只要toString()写得好,它就很有效.
不过,这有点笨拙.有时你想设计toString()用于其他目的,比如日志记录,也许你只想渲染一些对象字段而不是所有对象字段,或者根本没有定义toString(),依此类推.
我正在寻找更好的比较复杂对象图的方法.有什么想法吗?
mat*_*t b 10
该Atlassian的开发者博客对这个非常同一主题的几篇文章,以及Hamcrest库如何能够调试这种测试失败的非常非常简单:
基本上,对于这样的断言:
assertThat(lukesFirstLightsaber, is(equalTo(maceWindusLightsaber)));
Run Code Online (Sandbox Code Playgroud)
Hamcrest会像这样返回输出(其中只显示不同的字段):
Expected: is {singleBladed is true, color is PURPLE, hilt is {...}}
but: is {color is GREEN}
Run Code Online (Sandbox Code Playgroud)
您可以做的是使用XStream将每个对象渲染为XML ,然后使用XMLUnit对XML进行比较.如果它们不同,那么您将获得上下文信息(以XPath,IIRC的形式),告诉您对象的不同之处.
例如,来自XMLUnit doc:
Comparing test xml to control xml [different]
Expected element tag name 'uuid' but was 'localId' -
comparing <uuid...> at /msg[1]/uuid[1] to <localId...> at /msg[1]/localId[1]
Run Code Online (Sandbox Code Playgroud)
请注意XPath指示不同元素的位置.
可能不快,但这可能不是单元测试的问题.
| 归档时间: |
|
| 查看次数: |
8858 次 |
| 最近记录: |