Assert.assertEquals junit参数顺序

Assert.assertEquals junit参数顺序,junit,Junit,JUnit中Assert.assertEquals方法的参数顺序是(预期,实际) 虽然在另一篇文章中有人说这是毫无原因的,但在我在Uni的一个Java课程中,教授提到了排序的一个具体原因,但我不记得了 有人能帮我解决这个问题吗?没有具体原因。他们本可以用另一种方式排列参数。顺便说一句,TestNG做到了 为了更好的可读性和表达性,我更喜欢使用流畅的断言 在工具/故障结果中正确标记-工具遵循此顺序,一些GUI工具将标记哪个值是预期值,哪个值是实际值。至少,如果标签与值匹配,它将最大限度地减少混淆;

JUnit中
Assert.assertEquals
方法的参数顺序是
(预期,实际)

虽然在另一篇文章中有人说这是毫无原因的,但在我在Uni的一个Java课程中,教授提到了排序的一个具体原因,但我不记得了


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

没有具体原因。他们本可以用另一种方式排列参数。顺便说一句,TestNG做到了

为了更好的可读性和表达性,我更喜欢使用流畅的断言

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

  • 整个assertEquals使用的一致性-如果您在整个断言中的顺序不一致,那么如果值在不同的情况下任意交换,您可能会混淆未来的您(或其他未来的维护者),这又会导致潜在的混淆

  • 跨assert方法的一致参数顺序-对于assertEquals可能是可逆的,但是对于其他assert*方法(在JUnit的内置和其他支持代码/libs中),顺序可能很重要。最好在所有这些方面保持一致

  • 未来的变化最后,未来的实施可能会有所不同

  • *技术*-预期值的
    等于所使用的
    方法:

  • 看了代码之后,有一个细微的区别。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
    方法互不自反),则可能会得到不同的结果:

    人为情况是ArrayList的预期值和可返回任何类型集合实例的实际值,可能是ArrayList,但也可能是自定义集合非列表类“Foo”的实例(即,
    Foo
    未实现
    List
    )。ArrayList的
    equals
    方法(实际上是它的
    AbstractList.equals
    )指定:

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

    也许“Foo”类的
    equals
    方法更允许指定:

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

    说:

    ArrayList expectArrayList = ...;
    Collection actualCollectionPossiblyFoo = ...
    Assert.assertEquals(expectedArrayList, actualCollectionPossiblyFoo)
    
    您是说您期望与ArrayList等价的东西(根据ArrayList/AbstractList对
    等于
    的定义)。如果
    
    actualCollectionPossiblyFoo
    实际上属于
    Foo
    类,因此不是
    列表
    ArrayList
    equals
    方法所需

    然而,这与说:

    ArrayList expectedArrayList = ...;
    Collection actualCollectionPossiblyFoo = ...;
    Assert.assertEquals(actualCollectionPossiblyFoo, expectedArrayList);
    
    因为
    actualCollectionPossbilyFoo
    可能是
    Foo
    的一个实例,并且 FoO可以考虑自己和<代码> ExpDeDayRistList根据
    Foo
    班级的
    equals
    方法。

    谢谢你的回答,伙计,尽管教授提到的原因有一些“重要的”推理,而不是一致性。我不太确定,但我认为这与测试不通过或方法因某种原因中断时发生的情况有关。