Assert.assertEquals junit参数顺序

时间:2013-04-28 20:45:46

标签: junit

JUnit中Assert.assertEquals方法的参数顺序为(expected, actual)

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

任何人都可以帮我解决这个问题吗?

2 个答案:

答案 0 :(得分:14)

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

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

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

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

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

  6. 查看代码后有一个细微的区别。 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

的流畅断言