Assert.assertEquals
JUnit中方法的参数顺序是(expected, actual)
尽管在另一个线程中有人说这是没有原因的,但在我在 Uni 的一个 Java 课程中,教授提到了该排序的具体原因,但我不记得了。
有人可以帮我解决这个问题吗?
Assert.assertEquals
JUnit中方法的参数顺序是(expected, actual)
尽管在另一个线程中有人说这是没有原因的,但在我在 Uni 的一个 Java 课程中,教授提到了该排序的具体原因,但我不记得了。
有人可以帮我解决这个问题吗?
工具/故障结果中的正确标记 - 工具遵循此顺序,一些 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 }
它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
,因此不是List
ArrayListequals
方法所要求的,这将失败。
但是,这与说:
ArrayList expectedArrayList = ...;
Collection actualCollectionPossiblyFoo = ...;
Assert.assertEquals(actualCollectionPossiblyFoo, expectedArrayList);
因为actualCollectionPossbilyFoo
可能是的一个实例,Foo
而 Foo 可能认为自己和expectedArrayList
根据
Foo
类的equals
方法是相等的。
没有具体原因。他们本可以以另一种方式对参数进行排序。顺便说一句,TestNG以另一种方式进行。
为了更好的可读性和可表达性,我更喜欢使用fest-assert 的流利断言