15

Assert.assertEqualsJUnit中方法的参数顺序是(expected, actual)

尽管在另一个线程中有人说这是没有原因的,但在我在 Uni 的一个 Java 课程中,教授提到了该排序的具体原因,但我不记得了。

有人可以帮我解决这个问题吗?

4

2 回答 2

15
  1. 工具/故障结果中的正确标记 - 工具遵循此顺序,一些 GUI 工具将标记哪个值是预期值,哪个值是实际值。至少,如果标签与值匹配,它将最大限度地减少混淆;在最坏的情况下,您会花费时间/精力来追踪错误的问题,试图追踪并非实际值的实际值的来源。

  2. assertEquals 用法的一致性- 如果您在整个断言中的顺序不一致,如果值在不同情况下任意交换,您可能会混淆未来的您(或其他未来的维护者),再次导致潜在的混乱。

  3. 跨断言方法的一致参数排序- 它对于 assertEquals 可能是可逆的,但对于其他 assert* 方法(在 JUnit 的内置函数和其他支持代码/库中),该顺序可能很重要。最好在它们之间保持一致。

  4. 未来的变化- 最后,未来的实施可能会有所不同。

  5. *技术* - 它使用的期望值的equals方法:

查看代码后有一个细微的差别。许多 assertEquals() 的使用最终都会通过这个方法运行:

115 static public void assertEquals(String message, Object expected,
116         Object actual) {
117     if (expected == null && actual == null)
118         return;
119     if (expected != null && isEquals(expected, actual))
120         return;
...
128
129 private static boolean isEquals(Object expected, Object actual) {
130     return expected.equals(actual);
131 }

equals是当两个对象都为非空时使用的期望值的方法。有人可能会争辩说您知道预期值的类别(因此知道equals预期值类别的方法的行为),但您可能不一定知道实际值的类别(理论上可能有更宽松的equals方法)。因此,如果您交换两个参数,您可能会得到不同的结果(即两个不同类的equals方法彼此自反):

人为的情况是 ArrayList 的预期值和可以返回任何类型的 Collection 实例的实际值,可能是 ArrayList,但也可能是自定义 Collection 非列表类 'Foo' 的实例(即Foo不实现List) . ArrayList 的equals方法(实际上是它的AbstractList.equals)指定:

当且仅当指定对象也是一个列表时返回 true,两个列表具有相同的大小,并且两个列表中所有对应的元素对都相等。

也许 'Foo' 类的equals方法更允许指定:

当且仅当指定对象也是一个集合时返回 true,两个集合具有相同的大小,并且两个集合包含相等的对象但不一定以相同的顺序。

通过说:

ArrayList expectArrayList = ...;
Collection actualCollectionPossiblyFoo = ...
Assert.assertEquals(expectedArrayList, actualCollectionPossiblyFoo)

您是说您期望与 ArrayList 等效的东西(根据 ArrayList/AbstractList 的定义equals)。如果 actualCollectionPossiblyFoo确实属于类Foo,因此不是ListArrayListequals方法所要求的,这将失败。

但是,这与说:

ArrayList expectedArrayList = ...;
Collection actualCollectionPossiblyFoo = ...;
Assert.assertEquals(actualCollectionPossiblyFoo, expectedArrayList);

因为actualCollectionPossbilyFoo可能是的一个实例,Foo而 Foo 可能认为自己和expectedArrayList根据 Foo类的equals方法是相等的。

于 2013-04-28T21:40:17.087 回答
0

没有具体原因。他们本可以以另一种方式对参数进行排序。顺便说一句,TestNG以另一种方式进行。

为了更好的可读性和可表达性,我更喜欢使用fest-assert 的流利断言

于 2013-04-28T21:25:55.910 回答