Mockito – Mock

Mocki to obiekty które symulują zachowanie prawdziwego obiektu i prawdziwego kodu. Inaczej mówiąc to pewnego rodzaju wrapper który wygląda jak dany obiekt. Mogą być tworzone dynamicznie w czasie runtime i zapewniają większą elastyczność w porównaniu do stubów. Mockujemy obiekty i symulujemy działanie metody.

Aby dobrze zrozumieć różnicę pomiędzy Mockiem a Stubem przykład Mocka będzie na podstawie tej samej metody która została wykorzystana do opisania stubów.

Skorzystać z mocka możemy na dwa sposoby: pierwszy wykorzystując metoda „mock” z biblioteki Mockito. Metoda przyjmuje 1 parametr: nawaKlasy.class której argument chcemy zamokować. Czyli w naszym przykładzie będzie to interfejs AccoutRepository.class. Nastepnie tak utworzony mock jest przekazany do naszego serwisu w konstruktorze. Definicja mocka wygląda więc podobnie jak u stuba.

metoda mock

Gdy włączymy jednak powyższy test zobaczymy iż jest negatywny. Gdy zaś prześledzimy kolejno etapy testu w trybie debug to zobaczymy że w rzeczywistości jest zwracana pusta lista.

pusta lista w trybie debug

Wynika to z faktu że mocki korzystają z Nice moków. Więc jeśli w klasach które mokujemy znajdują się metody które zwracają jakieś wartości to mockito postara się zwrócić pozytywny neutralny wynik. Jeśli więc nie napiszemy wartości testowych to mockito będzie zwracało wartości domyślne czyli dla obiektów null, false dla boolean i 0 dla Integer’a.  

Rozwiązaniem tej sytuacji jest przygotowanie danych testowych. Jednak w przeciwieństwie do stubów w przypadku mocków takie dane możemy wydzielić do osobnej metody w tej samej klasie testowej.

Dane testowe dla mock’a.

Natomiast w metodzie testowej w zmiennej przechowujemy dane te dane testowe. Dalej symulujemy działanie testu że jeśli zostanie wywołana metoda getAllAccounts zostanie wywołana lista kont z naszych danych testowych. Możemy to wykonać za pomocą metody when który zawiera mock’a i metodę oraz thenReturn które określa co chcemy aby zostało zwrócone. Wszystkie te operacje są zawarte w sekcji given. Całość wygląda tak jak poniżej:

List<Account> accounts = prepareAccountData();
AccountRepository accountRepository = mock(AccountRepository.class);    
AccountService accountService = new AccountService(accountRepository);
when(accountRepository.getAllAccount()).thenReturn(accounts);

Leave a Comment

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *