2013-04-28 3 views
12

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

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

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

ответ

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

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

  3. Последовательное упорядочение параметров по методам Assert - Это может быть обратимым для assertEquals, но порядок может иметь значение для других методов утверждают * (в встроенных модулей JUnit и в других вспомогательных кодов/LIBS). Лучше быть последовательным во всех них.

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

  5. * Технический * - 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 и фактическое значение, которое могло бы возвращать экземпляр экземпляра любого типа, возможно, ArrayList, но также возможно экземпляр пользовательского Collection non-List class 'Foo' (т.е.Foo не реализует List). equals метод The ​​ArrayList (в действительности его AbstractList.equals) указывает:

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

Возможно equals метод «Foo» класса является более снисходительными с указанием:

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

Говоря:

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

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

Однако, это не то же самое, как говорят:

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

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

+0

Благодарим за ответного помощника, хотя причина, о которой говорил профессор, имела некоторые «важные» рассуждения, четкие, чем последовательность. Я не совсем уверен, но я думаю, что это было связано с тем, что происходит, когда тест не проходит или когда метод по какой-то причине ломается. –

+1

Спасибо большое, друг! –

0

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

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

Смежные вопросы