|
|
1
8
这 Atlassian Developer Blog 有几篇关于这个主题的文章,以及Hamcrest库如何使调试这种测试失败变得非常简单:
Hamcrest将返回如下输出(其中仅显示不同的字段):
|
|
|
2
10
您可以使用以下命令将每个对象渲染为XML XStream ,然后使用 XMLUnit 对XML进行比较。如果它们不同,那么您将获得上下文信息(以XPath、IIRC的形式),告诉您对象的不同之处。 例如,从XMLUnit文档中:
注意XPath指示不同元素的位置。 可能不会很快,但这对单元测试来说可能不是问题。 |
|
|
3
4
由于我倾向于设计复杂的对象,我在这里有一个非常简单的解决方案。 当设计一个需要编写equals方法(因此是hashCode方法)的复杂对象时,我倾向于编写一个字符串呈现器,并使用string类equals和hashCode的方法。 当然,渲染器不是toString:它真的不必让人容易阅读,它只包含我需要比较的所有值,而且按照习惯,我把它们按顺序排列,以控制我希望它们排序的方式;对于toString方法,这些都不一定是正确的。 当然,我缓存了这个渲染的字符串(以及hashCode值)。它通常是私有的,但将缓存的字符串包保留为私有可以让您在单元测试中看到它。 顺便说一句,当然,这并不总是我在交付的系统中最终得到的结果——如果性能测试表明这种方法太慢,我准备替换它,但这种情况很少见。到目前为止,这种情况只发生过一次,在一个可变对象被快速更改和频繁比较的系统中。 我这样做的原因是 writing a good hashCode isn't trivial ,并且需要测试(*),而使用String中的一个则避免了测试。
|
|
|
4
3
此问题的代码存在于 http://code.google.com/p/deep-equals/ 使用DeepEquals.dephEquals(a,b)比较两个Java对象的语义相等性。这将使用它们可能具有的任何自定义equals()方法对对象进行比较(如果它们实现了除Object.equals()之外的equal()方法)。如果没有,此方法将继续逐字段递归比较对象。当遇到每个字段时,如果存在,它将尝试使用派生的equals(),否则它将继续递归。 此方法适用于循环对象图,如下所示:a->B->C->A.它具有循环检测功能,因此可以比较任何两个对象,并且它永远不会进入无休止的循环。 使用DeepEquals.hashCode(obj)为任何对象计算hashCode()。与deepEquals()一样,如果实现了自定义hashCode()方法(位于Object.hashCode()下方),它将尝试调用hashCode方法,否则它将逐字段递归计算hashCode。与deepEquals()一样,此方法将处理具有循环的对象图。例如,A->B->C->A.在这种情况下,hashCode(A)==hashCode。DeepEquals.dephHashCode()具有循环检测功能,因此适用于任何对象图。 |
|
|
5
1
单元测试应该有明确的定义, 他们测试的东西。这意味着最终你应该有明确的定义, 单 这两个物体可能有所不同。如果可能存在太多差异,我建议将此测试拆分为几个较小的测试。 |
|
|
6
1
所以我最终创建了贯穿图形的对象,边做边做。 通常有一个超类 爬行 对象:
从这个Crawling超类中,为许多需求制作了子类:
作为补充,我必须说,除了那些真正关心性能的实体外,我确实选择了这种技术来在我的实体上实现toString()、hashCode()、equals()和compareTo()。
对于关注性能的实体,我只是重写这些方法以不使用反射。我可以在回归JUnit测试中测试这两个实现的行为是否相同。 |
|
|
7
0
http://www.extreme-java.de/junitx/ 我能想到的测试equals()方法不同部分的唯一方法是将信息分解为更细粒度的信息。如果你正在测试一个嵌套很深的对象树,那么你所做的并不是真正的单元测试。您需要使用针对该类型对象的单独测试用例来测试图中每个单独对象的equals()合约。您可以使用带有简单equals()实现的存根对象来处理被测对象上的类类型字段。
|
|
|
8
0
我不会使用
在我看来,你的“单元”测试并没有隔离被测单元。例如,如果你的对象图是
因此,我将在测试中测试以下内容
通过这种方式,每次比较都使用JUnit断言,您将知道故障在哪里。
一个可能的问题是,如果你在比较系列。在这种情况下,我会使用一个实用程序来比较集合,比如公共集合
|
|
|
9
0
如果你愿意用scala编写测试,你可以使用 matchete compare objects graphs :
将产生以下错误消息
所以我们已经看到matchete在java代码库中运行良好。事实上,我在上一份大型Java项目的工作中一直在使用matchete。
|
|
|
wavesinaroom · 断言结构向量长度 1 年前 |
|
|
Tim Kirkwood · 比较空数据帧 1 年前 |
|
Kamran Khan · 使用单元测试ASP。NET核心 1 年前 |
|
|
paymer · 为什么我的代码没有删除我的单元测试生成的zip文件? 1 年前 |
|
|
Ricky Mo · 角度测试如何模拟导入的const 1 年前 |
|
|
Natty · Visual Studio中缺少“代码覆盖率结果” 1 年前 |