Assert.assertEquals junit参数顺序

Ale*_*tas 13 junit

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

虽然在另一个线程中有人说这是无缘无故的,但在我在Uni的一个Java课程中,教授提到了这种排序的具体原因,但我不记得了.

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

Ber*_*t F 14

  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 }
Run Code Online (Sandbox Code Playgroud)

equals是两个对象都为非null时使用的期望值的方法.有人可能会说你知道期望值的类(因此知道equals期望值类的方法的行为),但你可能不一定确切地知道实际值的类(理论上它可以更宽松)equals方法).因此,如果交换两个参数(即两个不同类的equals方法彼此之间没有反身),您可能会得到不同的结果:

一个人为的案例是ArrayList的一个期望值和一个可以返回任何类型的Collection实例的实际值,可能是一个ArrayList,但也可能是一个自定义Collection非List类'Foo'的实例(即Foo没有实现List) .ArrayList的equals方法(实际上是它AbstractList.equals)指定:

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

也许'Foo'类的equals方法更宽松,指定:

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

说:

ArrayList expectArrayList = ...;
Collection actualCollectionPossiblyFoo = ...
Assert.assertEquals(expectedArrayList, actualCollectionPossiblyFoo)
Run Code Online (Sandbox Code Playgroud)

你说你期待的东西等同于ArrayList(根据ArrayList/AbstractList的定义equals).如果actualCollectionPossiblyFoo确实是类Foo,那么这将失败 ,因此不是ListArrayList equals方法所要求的.

但是,这与说:

ArrayList expectedArrayList = ...;
Collection actualCollectionPossiblyFoo = ...;
Assert.assertEquals(actualCollectionPossiblyFoo, expectedArrayList);
Run Code Online (Sandbox Code Playgroud)

因为actualCollectionPossbilyFoo可能是一个实例,Foo而Foo可能expectedArrayList会根据Foo类的equals方法考虑自己并且相等 .