我必须比较两个不同类型的复杂对象(并且在类型层次结构中没有公共的超类),但在逻辑上它们可能是等价的。问题是如何在对象不相等的情况下返回有关比较结果的信息;我想告诉调用者为什么对象是不相等的(哪些字段不同,它们有什么不同)。
到目前为止的备选办法是:
但我觉得它们不太雅致/好。
另外,是否有一种方法可以将字段比较委托给来自assertEquals的JUnit,从而将我的比较建立在没有比较测试的JUnit基础上,从而成为一个实际的单元测试?
发布于 2012-05-09 07:42:31
如果比较比较复杂,则比较的结果是(正如您提到的)潜在的复杂。
因此,我建议您考虑第三个选项:创建一个自定义类,即封装结果信息的ComparisonResult。
您甚至可以创建一个小层次结构,并依赖于多态性来简化代码。下面是一个例子:
ComparisonResult
|
+--- Equals
|
+--- Not equals
|
+--- Compatible (with "isAbeforeB()")
|
+--- Incompatible (with "getReason()")Incompatible可能是最混乱的类,我建议您通过列出这些对象不兼容的原因来实现它。原因可能本身就是一个抽象类,其中有一些子类,如MissingField等。
发布于 2012-05-09 07:44:00
小心!如果比较实现不匹配等于,则在不同容器实现中使用该对象时可能会遇到麻烦。
也就是说,比较接口只能返回int,所以您必须想出一种不影响可比性的不同方法。
发布于 2012-05-09 07:44:43
equals方法应该只返回一个布尔值(等于或不等于)。
您不应该将比较和获取差异的功能混为一谈。
就您的目的而言,如果您没有公共超类(除了对象),那么实现一个额外的方法(a.getDifferences(b)或静态方法Comparision.getDifferences(a,b)是有意义的)。
对于等于的实现,调用getDifferences方法并检查返回的对象是否为空是有意义的。
结果可能是一个字符串或一个单独的对象。
https://stackoverflow.com/questions/10511767
复制相似问题