Параметры параметров Assert.assertEquals junit

Порядок параметров для метода Assert.assertEquals в JUnit равен (expected, actual)

Хотя в другом потоке кто-то сказал, что это без причины, на одном из моих Java-классов в Uni профессор упомянул конкретную причину этого заказа, но я его не помню.

Кто-нибудь может помочь мне с этим?

Ответ 1

  • Надлежащая маркировка в результатах инструментов/сбоев. Инструменты следуют этому порядку, а некоторые инструменты GUI будут обозначать, какое значение является ожидаемым значением, а какое значение является фактическим значением. По крайней мере, это минимизирует путаницу, если метки соответствуют значениям; в худшем случае вы тратите время/усилия на отслеживание неправильной проблемы, пытаясь отследить источник фактического значения, которое фактически не было фактическим значением.

  • Согласованность использования assertEquals. Если вы не согласны в своем заказе на протяжении всех своих утверждений, вы можете смутить будущее - вас (или другого будущего сопровождающего), если значения будут произвольно меняться от случая к случаю, снова предоставляя потенциальную путаницу.

  • Согласование параметров параметров по методам assert. Это может быть обратимым для assertEquals, но порядок может иметь значение для других методов assert * (в встроенных JUnit-модулях и в других поддерживающих кодах /libs ). Лучше быть последовательным во всех них.

  • Изменения будущего. Наконец, может быть разница в будущей реализации.

  • * Техническое *. Используется метод 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, но также возможно экземпляр настраиваемого класса Non-List Collection 'Foo' (т.е. Foo не реализует List). Метод ArrayList equals (фактически его AbstractList.equals) указывает:

Возвращает true тогда и только тогда, когда указанный объект также является списком, как списки имеют одинаковый размер, а все соответствующие пары элементов в два списка равны.

Возможно, метод класса equals "Foo" более разрешительный:

Возвращает true тогда и только тогда, когда указанный объект также является коллекцией, как коллекции имеют одинаковый размер, и обе коллекции содержат равные объекты но не обязательно в том же порядке.

Говоря:

ArrayList expectArrayList = ...;
Collection actualCollectionPossiblyFoo = ...
Assert.assertEquals(expectedArrayList, actualCollectionPossiblyFoo)

вы говорите, что ожидаете нечто эквивалентное ArrayList (согласно определению ArrayList/AbstractList equals). Это не удастся, если actualCollectionPossiblyFoo действительно имеет класс Foo и, следовательно, не a List as требуемый методом ArrayList equals.

Однако это не то же самое, что сказать:

ArrayList expectedArrayList = ...;
Collection actualCollectionPossiblyFoo = ...;
Assert.assertEquals(actualCollectionPossiblyFoo, expectedArrayList);

поскольку actualCollectionPossbilyFoo может быть экземпляром Foo и Foo может считать себя и expectedArrayList равным согласно Foo класс equals.

Ответ 2

Нет никакой конкретной причины. Они могли бы заказать свои параметры по-другому. BTW, TestNG делает это другим способом.

Для лучшей читаемости и выразительности я предпочитаю использовать текущие утверждения с fest-assert