Co to jest Mockito

Definicja pojęcia Co to jest Mockito
Framework
Podstawy
String metody

Czym jest Mockito?


Kiedy zaczynałem swoją przygodę z programowaniem, słyszałem wiele o konieczności pisania testów jednostkowych. Wydawało mi się to nieco zaskakujące, ale z czasem zrozumiałem, jak ważne jest to dla zapewnienia jakości kodu. Wtedy też odkryłem Mockito, bibliotekę do tworzenia atrap (mocków) obiektów w testach jednostkowych.

Mockito to popularna biblioteka do testów jednostkowych w języku Java, która umożliwia tworzenie i sterowanie zachowaniem atrap obiektów. Umożliwia ona testowanie klasy w izolacji, co jest kluczowe dla skutecznych testów jednostkowych. Mockito jest łatwe w użyciu, a jednocześnie oferuje wiele zaawansowanych funkcji, dzięki czemu jest cenione przez programistów na całym świecie.

Zrozumienie znaczenia testów mock

Zastanawiasz się, dlaczego potrzebujesz Mockito do pisania testów jednostkowych? Powód jest prosty: testy mock są niezbędne do izolacji kodu, który testujesz, od reszty systemu. Dzięki temu możesz skupić się na konkretnym fragmencie kodu, nie martwiąc się o możliwe skutki uboczne wynikające z interakcji z innymi częściami systemu.

Testy mock pozwalają na symulowanie zachowania zależności w testowanym kodzie. Na przykład, jeśli twój kod zależy od zewnętrznej usługi, możesz utworzyć atrapę tej usługi, która zwraca oczekiwane dane, zamiast rzeczywiście łączyć się z tą usługą podczas testów. Dzięki temu możesz pisać testy, które są szybkie, niezawodne i łatwe do utrzymania.

Podstawy Mockito

Zacznijmy od podstaw Mockito. Najważniejszą rzeczą, którą musisz wiedzieć, jest to, jak utworzyć atrapę obiektu. Możesz to zrobić za pomocą metody mock(), która tworzy atrapę danego typu. Na przykład, jeśli masz klasę MyClass, możesz utworzyć jej atrapę w następujący sposób: MyClass mockMyClass = mock(MyClass.class);.

adnotacja @Mock jest używana do oznaczania pól, które mają zostać zastąpione atrapą (mockiem) w testach jednostkowych. Poniżej znajdziesz przykład użycia adnotacji @Mock oraz kilka metod związanych z mockami w Mockito.

Kiedy już masz atrapę, możesz zdefiniować jej zachowanie za pomocą metody when(). Ta metoda pozwala na zdefiniowanie, co ma zwrócić atrapa, gdy zostanie wywołana konkretna metoda. Na przykład, możesz zdefiniować, że atrapa mockMyClass zwróci wartość 42 po wywołaniu metody getValue(): when(mockMyClass.getValue()).thenReturn(42);.

Warto pamiętać, że jeżeli chcemy używać adnotacji musimy zainicjować mocki, możemy to zrobić przez użycie @RunWith(MockitoJUnitRunner.class) lub 
MockitoAnnotations.initMocks(this) w metodzie setUp().

				
					import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;

@RunWith(MockitoJUnitRunner.class)
public class ExampleTest {

    @Mock
    private SomeClass mockObject;

    @InjectMocks
    private AnotherClass anotherObject;

    // Testy...
}

				
			
				
					import org.junit.Before;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;

public class ExampleTest {

    @Mock
    private SomeClass mockObject;

    @Before
    public void setUp() {
        MockitoAnnotations.initMocks(this);
    }

    // Testy...
}

				
			

W Springu również często używa się Mockito do testowania komponentów, serwisów, itp. W przypadku Springa, możesz skorzystać z adnotacji @MockBean w połączeniu z @SpringBootTest do automatycznego wstrzykiwania mocków do kontekstu Springa.

Użycie adnotacji @Mock

				
					import org.junit.Before;
import org.junit.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;

import static org.mockito.Mockito.*;

public class UserServiceTest {

    // Adnotacja @Mock oznacza, że to pole będzie mockiem.
    @Mock
    private UserRepository userRepository;

    // Adnotacja @InjectMocks oznacza, że Mockito automatycznie wstrzyknie mocki do tego obiektu.
    @InjectMocks
    private UserService userService;

    @Before
    public void setUp() {
        // Inicjalizacja mocków przed testem.
        MockitoAnnotations.initMocks(this);
    }

    @Test
    public void testGetUserById() {
        // Przygotowanie przykładowego obiektu User.
        User sampleUser = new User(1, "John Doe");

        // Konfiguracja mocka userRepository, aby zwrócił przykładowego użytkownika, gdy wywoływana jest metoda getUserById z id=1.
        when(userRepository.getUserById(1)).thenReturn(sampleUser);

        // Wywołanie metody w klasie testowanej.
        User result = userService.getUserById(1);

        // Asercja: sprawdzenie, czy metoda getUserById została wywołana dokładnie raz z argumentem 1.
        verify(userRepository, times(1)).getUserById(1);

        // Asercja: sprawdzenie, czy wynik metody jest taki sam, jak oczekiwany przykładowy użytkownik.
        assertEquals(sampleUser, result);
    }
}

				
			

Użycie adnotacji metody mock()

				
					import org.junit.Test;

import static org.mockito.Mockito.*;

public class UserServiceTest {

    @Test
    public void testGetUserById() {
        // Stworzenie mocka dla interfejsu UserRepository.
        UserRepository userRepository = mock(UserRepository.class);

        // Przygotowanie przykładowego obiektu User.
        User sampleUser = new User(1, "John Doe");

        // Konfiguracja mocka userRepository, aby zwrócił przykładowego użytkownika, gdy wywoływana jest metoda getUserById z id=1.
        when(userRepository.getUserById(1)).thenReturn(sampleUser);

        // Utworzenie obiektu UserService i ręczne wstrzyknięcie mocka userRepository.
        UserService userService = new UserService(userRepository);

        // Wywołanie metody w klasie testowanej.
        User result = userService.getUserById(1);

        // Asercja: sprawdzenie, czy wynik metody jest taki sam, jak oczekiwany przykładowy użytkownik.
        assertEquals(sampleUser, result);

        // Asercja: sprawdzenie, czy metoda getUserById została wywołana dokładnie raz z argumentem 1.
        verify(userRepository, times(1)).getUserById(1);
    }
}

				
			

Jak działa Mockito?

Możesz teraz zastanawiać się, jak Mockito osiąga to wszystko. Biblioteka ta działa na poziomie JVM, manipulując bajtkodem klas, aby stworzyć atrapy. Kiedy tworzysz atrapę za pomocą Mockito, biblioteka tworzy nową klasę, która dziedziczy po klasie atrapy. Ta nowa klasa ma nadpisane wszystkie metody, dzięki czemu Mockito może kontrolować ich zachowanie.

Najważniejszą częścią pracy Mockito jest zrozumienie, jak używać instrukcji verify(). Ta metoda pozwala na sprawdzenie, czy konkretne metody zostały wywołane na atrapie. Na przykład, jeśli chcesz sprawdzić, czy metoda setValue() została wywołana na atrapie mockMyClass, możesz to zrobić w następujący sposób: verify(mockMyClass).setValue(anyInt());.

Konfiguracja Mockito

Przed rozpoczęciem pracy z Mockito, musisz najpierw skonfigurować bibliotekę. Mockito jest dostępne jako zależność Maven i Gradle, co oznacza, że możesz dodać ją do swojego projektu za pomocą odpowiedniego pliku konfiguracyjnego.

Po dodaniu Mockito do swojego projektu, możesz zacząć tworzyć atrapy i definiować ich zachowanie. Pamiętaj jednak, że Mockito jest narzędziem do tworzenia atrap, a nie do generowania faktycznych implementacji twoich klas. Celem Mockito jest ułatwienie pisania testów jednostkowych, a nie zastępowanie rzeczywistego kodu.

				
					import org.junit.Test;

import static org.mockito.Mockito.*;

public class UserServiceTest {

    @Test
    public void testGetUserById() {
        // Stworzenie mocka dla interfejsu UserRepository.
        UserRepository userRepository = mock(UserRepository.class);

        // Przygotowanie przykładowego obiektu User.
        User sampleUser = new User(1, "John Doe");

        // Konfiguracja mocka userRepository, aby zwrócił przykładowego użytkownika, gdy wywoływana jest metoda getUserById z id=1.
        when(userRepository.getUserById(1)).thenReturn(sampleUser);

        // Utworzenie obiektu UserService i ręczne wstrzyknięcie mocka userRepository.
        UserService userService = new UserService(userRepository);

        // Wywołanie metody w klasie testowanej.
        User result = userService.getUserById(1);

        // Asercja: sprawdzenie, czy wynik metody jest taki sam, jak oczekiwany przykładowy użytkownik.
        assertEquals(sampleUser, result);

        // Asercja: sprawdzenie, czy metoda getUserById została wywołana dokładnie raz z argumentem 1.
        verify(userRepository, times(1)).getUserById(1);
    }
}

				
			

Jak działa Mockito?

Możesz teraz zastanawiać się, jak Mockito osiąga to wszystko. Biblioteka ta działa na poziomie JVM, manipulując bajtkodem klas, aby stworzyć atrapy. Kiedy tworzysz atrapę za pomocą Mockito, biblioteka tworzy nową klasę, która dziedziczy po klasie atrapy. Ta nowa klasa ma nadpisane wszystkie metody, dzięki czemu Mockito może kontrolować ich zachowanie.

Najważniejszą częścią pracy Mockito jest zrozumienie, jak używać instrukcji verify(). Ta metoda pozwala na sprawdzenie, czy konkretne metody zostały wywołane na atrapie. Na przykład, jeśli chcesz sprawdzić, czy metoda setValue() została wywołana na atrapie mockMyClass, możesz to zrobić w następujący sposób: verify(mockMyClass).setValue(anyInt());.

Konfiguracja Mockito

Przed rozpoczęciem pracy z Mockito, musisz najpierw skonfigurować bibliotekę. Mockito jest dostępne jako zależność Maven i Gradle, co oznacza, że możesz dodać ją do swojego projektu za pomocą odpowiedniego pliku konfiguracyjnego.

Po dodaniu Mockito do swojego projektu, możesz zacząć tworzyć atrapy i definiować ich zachowanie. Pamiętaj jednak, że Mockito jest narzędziem do tworzenia atrap, a nie do generowania faktycznych implementacji twoich klas. Celem Mockito jest ułatwienie pisania testów jednostkowych, a nie zastępowanie rzeczywistego kodu.

Pisanie testów za pomocą Mockito

Pisanie testów za pomocą Mockito jest proste i intuicyjne. Zacznij od utworzenia atrapy za pomocą metody mock(), a następnie zdefiniuj jej zachowanie za pomocą metody when(). Kiedy już masz gotową atrapę, możesz ją użyć w swoim teście jednostkowym.

Na przykład, jeśli testujesz metodę, która zależy od jakiejś zewnętrznej usługi, możesz utworzyć atrapę tej usługi i zdefiniować jej zachowanie. Następnie, w teście jednostkowym, możesz użyć tej atrapy zamiast prawdziwej usługi. Dzięki temu twój test będzie szybki, niezawodny i łatwy do utrzymania.

Zaawansowane funkcje Mockito

Chociaż Mockito jest łatwe w użyciu, oferuje wiele zaawansowanych funkcji, które mogą być przydatne w bardziej skomplikowanych scenariuszach testowych. Na przykład, możesz użyć funkcji spy() do tworzenia atrap, które zachowują część oryginalnego zachowania obiektu.

Inną zaawansowaną funkcją jest ArgumentCaptor, który pozwala na przechwycenie argumentów, które są przekazywane do atrap. To może być bardzo przydatne, gdy chcesz sprawdzić, czy twój kod wywołuje metody atrap z oczekiwanymi argumentami.

Wskazówki i najlepsze praktyki dotyczące użycia Mockito

Podsumowując, Mockito to potężne narzędzie do pisania testów jednostkowych, ale jak każde narzędzie, wymaga prawidłowego użycia. Oto kilka wskazówek i najlepszych praktyk, które pomogą ci efektywnie korzystać z Mockito:

  1. Używaj Mockito do izolacji kodu, który testujesz – to jest główny cel stosowania atrap.
  2. Unikaj nadużywania Mockito – atrapy są przydatne, ale nie zastąpią prawdziwych testów integracyjnych.
  3. Zawsze sprawdzaj, czy twoje atrapy są używane – używaj metody verify(), aby upewnić się, że twój kod faktycznie wywołuje metody na atrapach.

Podsumowanie

Na koniec, Mockito to potężne narzędzie do tworzenia atrap w testach jednostkowych. Dzięki niemu możesz pisać testy, które są szybkie, niezawodne i łatwe do utrzymania. Chociaż Mockito wymaga pewnej praktyki, z czasem stanie się nieocenionym narzędziem w twoim zestawie programistycznym.

Free

Top 40 pytań rekrutacyjnych Java poziom Senior

Free

Pytania rekrutacyjne JavaScript

« » page 1 / 2
Scroll to Top