Mockito - Panoramica

Cos'è il Mocking?

Il mocking è un modo per testare la funzionalità di una classe in isolamento. Il mocking non richiede una connessione al database o la lettura del file delle proprietà o della lettura del file server per testare una funzionalità. Gli oggetti fittizi prendono in giro il vero servizio. Un oggetto fittizio restituisce un dato fittizio corrispondente a un input fittizio passato ad esso.

Mockito

Mockito facilita la creazione di oggetti fittizi senza interruzioni. Utilizza Java Reflection per creare oggetti fittizi per una determinata interfaccia. Gli oggetti fittizi non sono altro che proxy per le implementazioni effettive.

Si consideri un caso di Stock Service che restituisce i dettagli del prezzo di un'azione. Durante lo sviluppo, il servizio di magazzino effettivo non può essere utilizzato per ottenere dati in tempo reale. Quindi abbiamo bisogno di un'implementazione fittizia del servizio di magazzino. Mockito può fare lo stesso molto facilmente, come suggerisce il nome.

Benefici di Mockito

  • No Handwriting - Non è necessario scrivere oggetti fittizi da soli.

  • Refactoring Safe - La ridenominazione dei nomi dei metodi di interfaccia o il riordino dei parametri non interromperà il codice di test poiché i mock vengono creati in fase di esecuzione.

  • Return value support - Supporta i valori di ritorno.

  • Exception support - Supporta le eccezioni.

  • Order check support - Supporta il controllo dell'ordine delle chiamate ai metodi.

  • Annotation support - Supporta la creazione di mock utilizzando l'annotazione.

Considera il seguente frammento di codice.

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);
   }
}

Comprendiamo i concetti importanti del programma sopra. Il codice completo è disponibile nel capitoloFirst Application.

  • Portfolio - Un oggetto per trasportare un elenco di azioni e per ottenere il valore di mercato calcolato utilizzando i prezzi delle azioni e la quantità di azioni.

  • Stock - Un oggetto per contenere i dettagli di uno stock come il suo ID, nome, quantità, ecc.

  • StockService - Un servizio di stock restituisce il prezzo corrente di un'azione.

  • mock(...) - Mockito ha creato una simulazione di stock service.

  • when(...).thenReturn(...)- Simulazione dell'implementazione del metodo getPrice dell'interfaccia stockService. Per googleStock, restituisci 50.00 come prezzo.

  • portfolio.setStocks(...) - Il portafoglio ora contiene un elenco di due azioni.

  • portfolio.setStockService(...) - Assegna l'oggetto stockService Mock al portfolio.

  • portfolio.getMarketValue() - Il portafoglio restituisce il valore di mercato in base alle sue azioni utilizzando il servizio di azioni fittizie.