2013-04-28 8 views
12

Kolejność parametrów Assert.assertEquals metody w JUnit jest (expected, actual)parametry Assert.assertEquals JUnit zamówić

Chociaż w innym wątku ktoś powiedział, że to bez powodu, w jednym z moich klas Javy w Uni profesor wspomniał specyficzny powód tego porządku, ale go nie pamiętam.

Ktoś może mi w tym pomóc?

Odpowiedz

15
  1. Proper etykietowania narzędzi/awaria wynika - Narzędzia naśladują tego porządku i kilka narzędzi GUI etykiecie, która wartość jest oczekiwana wartość i która wartość jest rzeczywistą wartością. Przynajmniej zminimalizuje to zamieszanie, jeśli etykiety będą pasować do wartości; w najgorszym przypadku poświęcasz czas/wysiłek na znalezienie niewłaściwego problemu, próbując znaleźć źródło rzeczywistej wartości, która w rzeczywistości nie była faktyczną wartością.

  2. Spójność całej assertEquals Wykorzystanie - Jeśli nie są zgodne z zamówieniem waszych twierdzeń, można mylić przyszłość-ty (lub inny przyszły opiekun), jeśli wartości są zamienione dowolnie z etui do wypadku ponownie pożyczając do potencjalnego zamieszania.

  3. Konsekwentne parametr zamawiania całej metod dochodzić - To może być odwracalny dla assertEquals, ale kolejność można znaczenia dla innych metod assert * (w budowanych-ins JUnit i innych wspierających CODE/libs). Lepiej być konsekwentnym we wszystkich.

  4. Zmiany w przyszłości - Może się zdarzyć różnica w przyszłym wdrożeniu.

  5. * techniczne * - equals metoda Jego oczekiwana wartość, która jest używana:

Jest jedna subtelna różnica po patrząc na kod. Wiele zastosowań assertEquals() zakończy się z systemem za pośrednictwem tej metody:

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 } 

Jego metoda wartości oczekiwanej, który jest używany, gdy oba obiekty są niezerowe equals. Można argumentować, że znasz klasę oczekiwanej wartości (i tym samym znasz zachowanie metody wartości oczekiwanej wartości), ale niekoniecznie musisz znać pewną klasę rzeczywistej wartości (która teoretycznie mogłaby mieć więcej metoda permissive equals). W związku z tym, można uzyskać inny wynik, jeśli zamienić dwa argumenty (tj equals metody dwóch różnych klas są nie zwrotna od siebie):

zmyślony sprawa byłaby oczekiwana wartość ArrayList oraz wartość rzeczywista, która mogłaby zwrócić dowolny typ instancji kolekcji, ewentualnie ArrayList, ale także prawdopodobnie instancję niestandardowej kolekcji "Foo" klasy spoza listy (np.Foo nie implementuje List). equals metoda ArrayList jest (a właściwie jego AbstractList.equals) określa:

Zwraca true wtedy i tylko wtedy, gdy określony obiekt jest także lista obie wykazy mają ten sam rozmiar i wszystkie odpowiednie pary elementów w dwóch list są równe.

Może equals metoda „Foo” klasa jest bardziej liberalne określające:

Zwraca true wtedy i tylko wtedy, gdy określony obiekt jest także zbiór obie zbiory mają tę samą wielkość, a oba zbiory zawierają równe obiekty , ale niekoniecznie w tej samej kolejności.

Mówiąc:

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

mówisz, można się spodziewać czegoś równoważnego do ArrayList (zgodnie z definicją ArrayList/AbstractList dnia equals). To się nie powiedzie, jeśli jest w rzeczywistości klasy Foo, a zatem nie jest wymagane przez metodę ArrayList ArrayList equals.

Jednak to nie jest takie samo jak powiedzenie:

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

ponieważ actualCollectionPossbilyFoo może być instancją Foo i Foo może uważać siebie i expectedArrayList być równa według Foo klasa za equals metody.

+0

Dziękuję za kolegę z odpowiedzi, chociaż powód, dla którego profesor wspomniał, miał pewne "ważne" rozumowanie, bardziej szczere niż konsekwencja. Nie jestem do końca pewny, ale myślę, że to miało coś wspólnego z tym, co się dzieje, gdy test nie przechodzi lub gdy metoda z jakiegoś powodu się psuje. –

+1

Dziękuję bardzo kolego :) –

0

Nie ma konkretnego powodu. Mogli uporządkować swoje parametry w inny sposób. BTW, TestNG robi to the other way.

Dla lepszej czytelności i expressibility, wolę za pomocą biegle twierdzeń z fest-assert