Mockito - przegląd

Co to jest kpina?

Mockowanie to sposób na przetestowanie funkcjonalności klasy w izolacji. Mockowanie nie wymaga połączenia z bazą danych ani odczytu pliku właściwości ani odczytu z serwera plików w celu przetestowania funkcjonalności. Pozorowane obiekty kpią z prawdziwej usługi. Obiekt pozorowany zwraca fikcyjne dane odpowiadające jakimś fałszywym danym wejściowym przekazanym do niego.

Mockito

Mockito ułatwia płynne tworzenie pozorowanych obiektów. Używa Java Reflection do tworzenia pozorowanych obiektów dla danego interfejsu. Obiekty pozorowane to nic innego jak proxy dla rzeczywistych implementacji.

Rozważmy przypadek usługi magazynowej, która zwraca szczegóły ceny akcji. Podczas opracowywania rzeczywistej usługi magazynowej nie można używać do uzyskiwania danych w czasie rzeczywistym. Potrzebujemy więc fikcyjnej implementacji usługi magazynowej. Mockito może zrobić to samo bardzo łatwo, jak sugeruje jego nazwa.

Korzyści z Mockito

  • No Handwriting - Nie ma potrzeby samodzielnego pisania pozorowanych obiektów.

  • Refactoring Safe - Zmiana nazw metod interfejsu lub zmiana kolejności parametrów nie zepsuje kodu testu, ponieważ makiety są tworzone w czasie wykonywania.

  • Return value support - Obsługuje zwracane wartości.

  • Exception support - Obsługuje wyjątki.

  • Order check support - Obsługuje sprawdzanie kolejności wywołań metod.

  • Annotation support - Obsługuje tworzenie mocków za pomocą adnotacji.

Rozważ następujący fragment kodu.

package com.tutorialspoint.mock;

import java.util.ArrayList;
import java.util.List;

import static org.mockito.Mockito.*;

public class PortfolioTester {
   public static void main(String[] args){

      //Create a portfolio object which is to be tested		
      Portfolio portfolio = new Portfolio();

      //Creates a list of stocks to be added to the portfolio
      List<Stock> stocks = new ArrayList<Stock>();
      Stock googleStock = new Stock("1","Google", 10);
      Stock microsoftStock = new Stock("2","Microsoft",100);

      stocks.add(googleStock);
      stocks.add(microsoftStock);		

      //Create the mock object of stock service
      StockService stockServiceMock = mock(StockService.class);

      // mock the behavior of stock service to return the value of various stocks
      when(stockServiceMock.getPrice(googleStock)).thenReturn(50.00);
      when(stockServiceMock.getPrice(microsoftStock)).thenReturn(1000.00);

      //add stocks to the portfolio
      portfolio.setStocks(stocks);

      //set the stockService to the portfolio
      portfolio.setStockService(stockServiceMock);

      double marketValue = portfolio.getMarketValue();

      //verify the market value to be 
      //10*50.00 + 100* 1000.00 = 500.00 + 100000.00 = 100500
      System.out.println("Market value of the portfolio: "+ marketValue);
   }
}

Rozumiemy ważne koncepcje powyższego programu. Pełny kod jest dostępny w rozdzialeFirst Application.

  • Portfolio - Obiekt służący do prowadzenia listy zapasów i uzyskiwania wartości rynkowej obliczonej przy użyciu cen akcji i ilości zapasów.

  • Stock - Przedmiot zawierający szczegółowe informacje o magazynie, takie jak identyfikator, nazwa, ilość itp.

  • StockService - Usługa magazynowa zwraca bieżącą cenę akcji.

  • mock(...) - Mockito stworzył makietę usługi magazynowej.

  • when(...).thenReturn(...)- Mock implementacja metody getPrice interfejsu stockService. W przypadku GoogleStock zwróć 50,00 jako cenę.

  • portfolio.setStocks(...) - Portfel zawiera teraz listę dwóch akcji.

  • portfolio.setStockService(...) - przypisuje obiekt stockService Mock do portfela.

  • portfolio.getMarketValue() - Portfel zwraca wartość rynkową na podstawie swoich zapasów, korzystając z usługi makiety zapasów.