Testowanie aplikacji za pomocą JUnit5 i EasyMock. Część 2

Druga część naszego artykułu o testowaniu aplikacji za pomocą JUnit5 i EasyMock. Tym razem przyjrzymy się najlepszym praktykom JUnit, tworzeniu obiektów EasyMock.

list 12, 2021 306

Najlepsze praktyki JUnit: tworzenie obiektów EasyMock

Oto miła wskazówka na temat metody createMock. Jeśli sprawdzisz API EasyMocka, zobaczysz, że metoda createMock ma wiele podpisów. Podpis, którego używamy, to:

createMock method 1.JPG


Którego powinniśmy użyć? createMock (nazwa ciągu, Class claz) jest lepsza. Jeśli używasz createMock (Class claz), a Twoje oczekiwania nie są spełnione, pojawia się komunikat o błędzie podobny do następującego:

createMock Class 2 .JPG


Jak widzisz, ta wiadomość nie jest tak opisowa, jak byśmy chcieli. Jeśli zamiast tego użyjesz createMock (nazwa ciągu, Class claz) i odwzorujemy klasę na podaną nazwę, otrzymując coś takiego:

createMock String name Class claz 3.JPG


Fragment kodu z listing 6 otwiera połączenie HTTP z podanym adresem URL i odczytuje zawartość pod tym adresem URL. Załóżmy, że ten kod jest jedną z metod większej aplikacji, którą chcesz przetestować jednostkowo.

Listing 6 Klasa WebClient

WebClient class 4.JPG


W tym listingu:
  • Otwieramy połączenie HTTP (1)
  • Czytamy wszystkie otrzymane treści (2)
  • Jeśli wystąpi błąd, zwracamy null (3)

Chcemy przetestować metodę getContent WebClient. W tym celu musimy mockować wszystkie zależności od tej metody. W tym przykładzie mamy dwie zależności - jedna to ConnectionFactory, a druga to InputStream. Wygląda na to, że wystąpił problem, ponieważ EasyMock może tylko mockować interfejsy, a InputStream jest klasą.

Aby móc mockować klasę InputStream, musimy użyć rozszerzeń klas EasyMock. Reprezentują one projekt rozszerzenia EasyMock, który umożliwia generowanie obiektów mock dla klas i interfejsów. Odpowiada im druga zależność Mavena z listy 1.

Listing 7 Testowanie WebClient z EasyMock

Testing WebClient with EasyMock 5.JPG


Na listing 7 wykonujemy następujące czynności:

  1. Zaczynamy od zaimportowania potrzebnych nam obiektów (1). Zauważ, że ponieważ używamy rozszerzeń klas EasyMock, musimy teraz zaimportować obiekt org.easymock.classextension.EasyMock zamiast org.easymock.EasyMock. Teraz jesteśmy gotowi do tworzenia pozorowanych obiektów klas i interfejsów przy użyciu statycznie importowanych metod rozszerzeń klas.
  2. W (2), podobnie jak we wcześniejszych listach, deklarujemy obiekty, które chcemy mockować, aw (3) wywołujemy metodę createMock w celu ich zainicjowania.
  3. W (4) definiujemy oczekiwanie strumienia, gdy wywoływana jest metoda read (zwróć uwagę, że aby zatrzymać czytanie ze strumienia, ostatnią rzeczą do zwrócenia jest -1). Pracując ze strumieniem niskiego poziomu, definiujemy, jak czytać jeden bajt na raz, ponieważ InputStream czyta bajt po bajcie. W (5) oczekujemy wywołania metody close w strumieniu.
  4. Teraz musimy zaznaczyć, że skończyliśmy, deklarując nasze oczekiwania - robimy to, wywołując metodę replay (6). Metoda replay służy do przekazywania mockowania z fazy, w której rejestrujemy metodę, którą oczekujemy, że zostanie wywołana, do miejsca, w którym testujemy. Wcześniej zarejestrowaliśmy zachowanie, ale obiekt nie działa jako próba. Po wywołaniu powtórki działa zgodnie z oczekiwaniami. Reszta to wywołanie testowanej metody (7) i zapewnienie oczekiwanego wyniku (8).

Dodajemy również kolejny test, aby zasymulować stan, w którym nie możemy zamknąć InputStream.

  1. Definiujemy oczekiwanie, w którym oczekujemy wywołania metody close strumienia (9).
  2. W następnym wierszu deklarujemy, że w przypadku wystąpienia tego wywołania należy zgłosić wyjątek IOException (10).


Wnioski

W tym artykule przedstawiono kroki potrzebne do przetestowania aplikacji Java za pomocą JUnit 5 i EasyMock. Pokazaliśmy, jak przetestować funkcjonalność AccountService, mockując AccountManager i WebClient przez mockowanie ConnectionFactory i InputStream.

Jak sugeruje nazwa frameworka, korzystanie z EasyMock jest łatwe i jest opcją dla wielu projektów, ale abyś był świadomy całego mockującego obrazu, musimy wprowadzić inny framework, mockujący części usługi konta i klienta internetowego używając trzech różnych frameworków do mockowania: EasyMock, JMock i Mockito. W ten sposób czujesz "smak" tego, jak działa mockowanie.

Interesujesz się JUnit? Sprawdź nasze szkolenia


Catalin Tudose
Java and Web Technologies Expert


Udostępnij


Masz jeszcze jakieś pytania?
Skontaktuj się z nami
Thank you.
Your request has been received.