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ą.
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.
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.
Zmiany w przyszłości - Może się zdarzyć różnica w przyszłym wdrożeniu.
* 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.
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. –
Dziękuję bardzo kolego :) –