找出导致equals()返回false的原因

Ran*_*ron 1 java xml graph-theory equals

我怎样才能找出导致equals()返回false的原因?

我不是在问一个确定的方法,总是正确的方法,而是一些有助于开发过程的东西.目前我必须进入equals()调用(通常是它们的树),直到其中一个为假,然后进入它,令人作呕.

我想过使用对象图,将其输出到xml并比较两个对象.但是,XMLEncoder需要默认构造函数,jibx需要预编译,x-stream和简单的api不在我的项目中使用.我不介意将一个类,甚至一个包复制到我的测试区域并在那里使用它,但导入整个jar只是不会发生.

我还想过自己构建一个对象图遍历器,我可能仍然会这样做,但我不想开始处理特殊情况(有序集合,非有序集合,映射......)

知道如何去做吗?

编辑:我知道添加罐子是正常的做事方式.我知道罐子是可重复使用的单位.然而,(在我的项目中)所需的官僚机构并不能证明结果是合理的 - 我会继续进行调试和踩踏.

Ste*_*hen 5

这可能不是一个完整的图表比较...除非你的等于包括每个类中的每个属性...(你可以尝试== :))

尝试使用hamcrest匹配器 - 您可以在"全部"匹配器中组合每个匹配器:

Matcher<MyClass> matcher = CoreMatchers.allOf(
  HasPropertyWithValue.hasProperty("myField1", getMyField1()),
  HasPropertyWithValue.hasProperty("myField2", getMyField2()));
if (!matcher.matches(obj)){
  System.out.println(matcher.describeFailure(obj));
  return false;
}
return true;
Run Code Online (Sandbox Code Playgroud)

它会说:'期望myField1的值为"value"但是"不同的值"

当然,您可以内联静态工厂.这比使用apache-commons EqualsBuilder稍微重一点,但它确实可以准确描述失败的确切内容.

您可以创建自己的专用匹配器来快速创建这些表达式.在这里复制apache-commons EqualsBuilder是明智的.

BTW,hamcrest基本jar是32K(包括来源!)让你可以选择查看代码并对你的老板说"我会坚持这个作为我自己的代码"(我认为这是你的导入问题).