Assert.assertEquals
JUnit中方法的参数顺序是(expected, actual)
虽然在另一个线程中有人说这是无缘无故的,但在我在Uni的一个Java课程中,教授提到了这种排序的具体原因,但我不记得了.
有人可以帮我解决这个问题吗?
Ber*_*t F 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 }
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
,那么这将失败
,因此不是List
ArrayList equals
方法所要求的.
但是,这与说:
ArrayList expectedArrayList = ...;
Collection actualCollectionPossiblyFoo = ...;
Assert.assertEquals(actualCollectionPossiblyFoo, expectedArrayList);
Run Code Online (Sandbox Code Playgroud)
因为actualCollectionPossbilyFoo
可能是一个实例,Foo
而Foo可能expectedArrayList
会根据Foo
类的equals
方法考虑自己并且相等
.
归档时间: |
|
查看次数: |
7700 次 |
最近记录: |