JUnit中Assert.assertEquals
方法的参数顺序为(expected, actual)
虽然在另一个帖子中有人说这是无缘无故的,但在我在Uni的一个Java课程中,教授提到了这种排序的具体原因,但我不记得了。
任何人都可以帮我解决这个问题吗?
答案 0 :(得分:14)
工具/故障结果中的正确标签 - 工具遵循此顺序,一些GUI工具将标记哪个值是预期值,哪个值是实际值。至少,如果标签与值匹配,它将最大限度地减少混淆;在最坏的情况下,你花时间/努力追踪错误的问题,试图追踪实际价值的来源,而实际价值实际上并不是实际值。
断言使用assertEquals的一致性 - 如果您在整个断言中的顺序不一致,如果值被任意交换,您可能会混淆未来(或其他未来的维护者)个案,再次导致潜在的混淆。
断言方法的一致参数排序 - 对于assertEquals可能是可逆的,但顺序可能对其他assert *方法很重要(在JUnit的内置函数和其他支持代码/库中) )。更好地保持一致。
未来的变化 - 最后,未来的实施可能会有所不同。
* 技术 * - 使用的预期值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 }
它是两个对象都为非null时使用的期望值的equals
方法。有人可能会说你知道期望值的类(因而知道期望值类的equals
方法的行为),但你可能不一定知道实际值的类(理论上这个)可以有一个更宽松的equals
方法)。因此,如果你交换两个参数,你可能会得到不同的结果(即两个不同的类'equals
方法不彼此反身):
一个人为的案例是ArrayList的预期值和可以返回任何类型的Collection实例的实际值,可能是一个ArrayList,但也可能是自定义Collection非List类'Foo'的实例(即{ {1}}未实施Foo
)。 ArrayList的List
方法(实际上是equals
)指定:
当且仅当指定的对象也是列表时才返回true 列表具有相同的大小,以及所有相应的元素对 这两个名单是相同的。
也许'Foo'类的AbstractList.equals
方法更宽松,指定:
当且仅当指定的对象也是集合时才返回true 集合具有相同的大小,并且两个集合包含相同的对象 但不一定按照相同的顺序。
说:
equals
你是说你期望某种东西等同于ArrayList(根据ArrayList / AbstractList的ArrayList expectArrayList = ...;
Collection actualCollectionPossiblyFoo = ...
Assert.assertEquals(expectedArrayList, actualCollectionPossiblyFoo)
定义)。如果这将失败
equals
实际上属于actualCollectionPossiblyFoo
类,因此不是Foo
ArrayList List
方法所需的。
然而,这与说:
不一样equals
因为ArrayList expectedArrayList = ...;
Collection actualCollectionPossiblyFoo = ...;
Assert.assertEquals(actualCollectionPossiblyFoo, expectedArrayList);
可能是actualCollectionPossbilyFoo
的实例
Foo可以认为自己和Foo
相等
expectedArrayList
班级的Foo
方法。
答案 1 :(得分:0)
没有具体原因。他们可以从另一个方向订购他们的参数。顺便说一下,TestNG做到the other way。
为了更好的可读性和可表达性,我更喜欢使用fest-assert
的流畅断言