|
|
1
8
您可以做的是使用 XStream 然后使用 XMLUnit 对XML执行比较。如果它们不同,那么您将得到上下文信息(以xpath、iirc的形式),告诉您对象的不同之处。 例如,来自xmlunit文档:
请注意,xpath指示不同元素的位置。 可能不是很快,但这对于单元测试来说可能不是问题。 |
|
|
2
10
这个 Atlassian Developer Blog 有几篇关于这个主题的文章,以及Hamcrest库如何使调试这种测试失败变得非常简单: 基本上,对于这样的断言:
hamcrest将像这样返回输出(其中只显示不同的字段):
|
|
|
3
4
因为我倾向于设计复杂的对象,所以这里我有一个非常简单的解决方案。 当设计一个复杂的对象时,我需要为其编写一个equals方法(因此也是一个hashcode方法),我倾向于编写一个字符串呈现器,并使用string类equals和hashcode方法。 当然,渲染器并不是要字符串化:它不需要人类真正容易阅读,它包含了我需要比较的所有值,而且只包含了我需要比较的值,并且根据习惯,我将它们按控制我希望它们排序方式的顺序排列;对于ToString方法,没有一个值是正确的。 当然,我缓存这个呈现的字符串(以及hashcode值)。它通常是私有的,但是将缓存的字符串包保留为私有会让您从单元测试中看到它。 顺便说一下,这并不是我最终在交付的系统中得到的结果,当然-如果性能测试表明这个方法太慢,我准备替换它,但这是一个罕见的情况。到目前为止,这种情况只发生过一次,在一个系统中,易变物体被迅速地改变并经常被比较。 我这么做的原因是 writing a good hashCode isn't trivial ,并且需要测试(*),而使用字符串中的一个可以避免测试。 (*考虑到Josh Bloch编写好哈希代码方法的方法的第3步是测试它,以确保“equal”对象具有相等的哈希代码值,并确保覆盖了所有可能的变化本身并不简单。更微妙、更难测试的是分布) |
|
|
4
3
此问题的代码存在于 http://code.google.com/p/deep-equals/ 使用DePiQual.DeqQuales(A,B)比较两个Java对象的语义相等性。这将使用它们可能拥有的任何自定义equals()方法比较对象(如果它们实现的equals()方法不是object.equals())。如果没有,那么这个方法将继续递归地逐字段比较对象。当遇到每个字段时,如果它存在,它将尝试使用派生的equals(),否则它将继续递归。 此方法将在这样的循环对象图上工作:a->b->c->a。它具有循环检测功能,因此可以比较任意两个对象,并且永远不会进入无休止的循环。 使用deepequals.hashcode(obj)为任何对象计算hashcode()。与deepEquals()一样,如果实现了自定义hashcode()方法(在object.hashcode()下面),它将尝试调用hashcode()方法,否则它将逐字段递归(深层)计算hashcode。与deepEquals()一样,此方法将处理具有循环的对象图。例如,a->b->c->a。在这种情况下,hashcode(a)==hashcode(b)==hashcode(c)。deepEquals.deephashcode()具有循环检测功能,因此可以在任何对象图上工作。 |
|
|
5
1
单元测试应该有明确的定义, 单一的 他们测试的东西。这意味着最终你应该有明确的定义, 单一的 这两个物体可能不同。如果有太多的东西可以不同,我建议将这个测试分成几个较小的测试。 |
|
|
6
1
我跟你走的是同一条路。我还有其他的麻烦:
所以我最终创建了通过一个图表运行的对象,并在它们运行的过程中完成它们的工作。 通常有一个超类 爬行 对象:
从这个爬行超类中,子类可以满足许多需求:
作为补充,我必须说,除了那些真正关注性能的实体之外,我确实选择了在我的实体上实现ToString()、HashCode()、Equals()和CompareTo()的技术。 例如,如果一个或多个字段上的业务键是通过类上的@uniqueconstraint在Hibernate中定义的,那么让我们假设所有实体都在公共超类中实现了getIdent()属性。 “我的实体”超类具有依赖于此知识的这4个方法的默认实现,例如(需要注意空值):
对于关注性能的实体,我只是重写这些方法,不使用反射。我可以在回归JUnit测试中测试这两个实现的行为是否相同。 |
|
|
7
0
我们使用一个名为junitx的库来测试所有“公共”对象上的equals契约: http://www.extreme-java.de/junitx/ 我能想到的测试equals()方法的不同部分的唯一方法是将信息分解成更细粒度的内容。如果您正在测试一个深度嵌套的对象树,那么您所做的并不是真正的单元测试。您需要使用该类型对象的单独测试用例来测试图中每个单独对象的equals()契约。对于被测试对象上的类类型字段,可以使用stub对象和simplistic equals()实现。 高温高压 |
|
|
8
0
我不会用
在我看来,你的“单元”测试并没有隔离被测单元。例如,如果对象图是
所以我会在测试中测试以下内容
这样做,通过对每个比较使用JUnit断言,您将知道失败在哪里。
显然,如果你的班上有更多的孩子是决定平等的一部分,你需要测试更多的组合。不过,我想知道的是,您的单元测试不应该关心它直接接触的类之外的任何东西的行为。在我的例子中,这意味着,你可以假设
如果你在比较收藏品,可能会有一个问题。在这种情况下,我将使用一个实用程序来比较集合,例如公共集合
|
|
|
9
0
如果你愿意用scala编写你的测试,你可以使用 matchete . 它是一个Matchers集合,可以与JUnit一起使用,并提供 compare objects graphs 以下内容:
将生成以下错误消息
正如您在这里看到的,我一直在使用case类,Matchete可以识别这些类,以便深入到对象图中。
这是通过一个名为
所以我们看到MatCHETE与Java代码库工作得很好。事实上,我在一个大型Java项目上的最后一个工作中一直使用MatCHETE。 免责声明:我是Matchete的作者:) |
|
|
user29759326 · 如何返回递归函数中的最后一个值? 9 月前 |
|
|
malife89 · 将java中的字符串读取为正确的日期格式 9 月前 |
|
|
Tim · 在java中,有没有更快的方法将字节数组写入文件? 9 月前 |
|
|
rudraraj · java中未声明最终变量 10 月前 |
|
|
Bala Ji · 以下BFS的实施效率如何? 10 月前 |