Isolare i tuoi test nascondendo l’ambiente con EasyMock
Di Muso (del 14/12/2010 @ 20:30:00, in Informatica, linkato 3827 volte)
tratto da : Giampiero Granatella

I test unitari sono problematici quando ti trovi in un ambiente dove il contesto è fondamentale per far funzionare il tuo programma. Prendiamo ad esempio una servlet che ha bisogno di un application server (come Tomcat) per poter girare, o una EJB, o un qualsiasi programma che gira all’interno di un framework.

Come isolare il tuo programma, nascondendo l’ambiente, per poterlo testare? La soluzione è usare degli oggetti Mock, ogetti fittizzi che nascondono e fanno da interfaccia verso il mondo esterno.

In questo esempio userò EasyMock per fare il testing di una servlet isolandola dall’application server.

Ecco l’esempio di un mio test su una servlet che deve ricevere due parametri in ingresso: var_1 e var_2. La servlet leggerebbe i due parametri dalla request e poi li elabora all’interno del metodo doGet. Essendo il mio test fuori da un container devo nascondere HttpServletRequest tramite un mock object. Alla mia applicazione non interessa nulla di quello che la request fa o dovrebbe fare, interessa solo che mi restitutisca i miei due parametri.

EasyMock si comporta come un registratore (simile ad una macro): registriamo cosa l’oggetto deve fare e poi ci prepariamo ad usare la nostra registrazione quante volte vogliamo nei nostri test.

public class ServletTest extends TestCase {

public ServletTest(String name) {
super(name);
}

public void testGet() {
//passo 1.
HttpServletRequest request = createMock(HttpServletRequest.class);

//passo 2.
expect(request.getParameter("var_1")).andReturn("5");
expect(request.getParameter("var_2")).andReturn("10");

//passo 3.
replay(request);

//Passo 4.
//Oggetto del test
MyServlet servlet = new MyServlet();
try {
//esecuzione del metodo con Mock Object
servlet.doGet(request, null);
//TODO: verifiche...

} catch (ServletException e) {
e.printStackTrace();
fail("Servlet Exception");
} catch (IOException e) {
e.printStackTrace();
fail("IO Exception");
}
}
}

Un test con un easy mock si compone di quattro fasi:

  1. Creazione dell’oggetto mock  (metodo createMock) a partire da una interfaccia (HttpServletRequest) (passo 1)
  2. Addestriamo(registriamo) il nostro mock a come deve rispondere a particolari chiamate tramite i metodi expect() andReturn (passo2)
  3. Concludiamo la fase di registrazione e ci predisponiamo all’utilizzo con il metodo replay
  4. Utilizziamo il nostro mock nella nostra classe e verifichiamo i risultati

E questo è tutto, notate la semplicità e la pulizia offerte da EasyMock per registrare le sole funzioni che ci servono. Se volete utilizzare più volte un mock ricordate di usare il metodo reset per pulirlo prima di una successiva fase di addestramento.

Abbiamo visto come, tramite easyMock, possiamo effettuare test unitari nascondendo tutte quelle implementazioni di interfaccie dipendenti dall’esterno del nostro test.