Aby naprawić błąd w aplikacji, zmodyfikowałem metodę o nazwie postLogin
, dodając wywołanie do istniejącej metody o nazwie getShoppingCart
.
Kod
protected void postLogin() {
getShoppingCart();
}
Nie jestem jednak pewien, jaki jest najlepszy sposób na napisanie testu jednostkowego postLogin
.
Podejście 1
Użyj weryfikacji z Mockito, aby po prostu sprawdzić, czy metoda została wywołana.
verify(mock).getShoppingCart();
Podejście 2
Przetestuj efekt uboczny wywołania metody, pobierając wartość koszyka na zakupy użytkownika.
AssertNotNull(user.getShoppingCart());
Czy jedno podejście jest lepsze od drugiego?
getShoppingCart()
metoda nie ma skutków ubocznych, nie musisz sprawdzać, jak się nazywa. Jeśli ma skutki uboczne, naprawdę powinieneś zmienić jego nazwę, ponieważgetXXX()
metody konwencjonalnie powinny być idempotentne.getNextValue
? Prawdopodobnie ktoś mógłby powiedzieć „Nie nazywaj tego getterem; zmień nazwę nanextValue
”, ale widziałem już wcześniejgetNext
używane. Być może lepszym przykładem byłby obiekt reprezentujący elektron; co się stanie, kiedy zadzwonięgetPosition
? Lub gorzej,getPosition(); getVelocity();
Odpowiedzi:
Zwykle wolałbym metodę 2.
Dlaczego? Ponieważ chcesz
postLogin
zmienić jakiś stan systemu, ale sposób, w jaki to osiąga (i jakie metody wywołuje w tym celu wewnętrznie), jest jedynie szczegółem implementacji, nic, na co Twój test jednostkowy powinien przyjąć jakiekolwiek założenia. Lepiej więc, aby twój test weryfikował tylko stan końcowy.źródło
Zmieniłbym getShoppingCart na coś takiego jak initializeShoppingCart, cel tej metody powinien być jasny dla każdego, kto ją czyta, bez potrzeby sprawdzania, co robi metoda, a takie skutki uboczne mogą wywoływać zaskakujące zachowania dla użytkowników metody.
Jeśli getShoppingCart jest w innej klasie i jest już przetestowany jednostkowo, zastosowałbym podejście 1 - nie trzeba ponownie testować tego, co już przetestowano. W tym przypadku jesteśmy pewni, że getShoppingCart działa poprawnie i chcemy tylko upewnić się, że jest wywoływany z postLogin, więc jeśli ktoś w przyszłości usunie to wywołanie, test się nie powiedzie.
Jeśli getShoppingCart jest prywatną metodą, której nie można przetestować samodzielnie, zastosowałbym podejście 2, aby upewnić się, że po wywołaniu postLogin pożądana funkcjonalność getShoppingCart jest wykonywana zgodnie z oczekiwaniami.
źródło
Podczas testowania wywołania funkcji (nieważne lub nie), które ma efekt uboczny, najbardziej kompletne jest sprawdzenie, czy efekt uboczny nie tylko występuje, ale również sprawdzenie, czy efekt uboczny (wyjście systemu lub zmiana stanu) jest pożądany.
źródło
Nie będę omawiać twojego projektu, ale w twoim przypadku wybrałbym pierwsze podejście, ponieważ test jednostkowy służy do testowania, jakie metody robią technicznie niezależnie od ich pracy w domenie, to znaczy, co
postLogin
robi twoja metoda ? Technicznie to wywołuje,getShoppingCard
więc musisz przetestować, który naprawdę dzwonigetShoppingCard
, stworzę też kolejny test,getShoppingCard
aby sprawdzić, co robi, a jeśli ma skutki uboczne, sprawdzę to w tym nowym teście.źródło
Masz błąd w postLogin. Pierwszą rzeczą, którą powinieneś zrobić, to stworzyć test jednostkowy, który po wywołaniu postLogin bez oczekiwanego zestawu informacji „zawiedzie”.
Na podstawie powyższego pomysłu inną alternatywą spośród 2 proponowanych jest wstrzyknięcie informacji o koszyku jako parametru. Jeśli nie masz poprawnych informacji, zgłaszasz niesprawdzony wyjątek. Wyjaśni to, że bez prawidłowych danych twoja metoda jest skazana na niepowodzenie.
Będzie to wymagało niewielkiej zmiany, w której klient dzwoniący teraz do postLogin jest również zobowiązany do przekazania informacji o koszyku. Dla mnie jest to nadal spójne, kiedy widzisz, że są ze sobą powiązane. To połączenie zostanie wykonane przez dzwoniącego.
Wtedy nie musiałbyś nawet testować getShoppingCart wewnątrz postLogin, ponieważ prawdziwą testowaną metodą jest postLogin. Jest to ten, który ma błąd, i jedyny, który wymaga odpowiedniej naprawy i weryfikacji. Dzięki wstrzykniętej zależności będziesz mógł ją łatwo przetestować w różnych warunkach i potwierdzić, że nie zostanie zgłoszony żaden błąd.
źródło