Spy objects

Spy object

Un altro modo per implementare punti di osservazione che controllino e instrumentino le chiamate effettuate dal SUT su determinati DOC sono gli spy object. A differenza dei mock, questi sono costruiti a partire da oggetti reali.
Successivamente alla fase d’interazione con il SUT (exercise), durante la fase di verifica dei risultati (verify), il test confronta le chiamate effettuate dal SUT sul Test Spy con il comportamento desiderato (expected).

Questi si rende utile quando non sarà possibile trattare la nostra funzione come una “black-box” di cui dobbiamo testare solo i metodi pubblici ma avremo necessità di toccare pure le sue implementazione private interne. Questo di base è un segno che ci fa capire che la classe in questione è troppo grande e “potente”, sarebbe meglio prendere in considerazione di spostare parte delle funzioni in altre classi e implementare un testing migliore. Per questa ragione l’utilizzo degli Spy Objects è sconsigliato pure dal professore.

Senza Mockito Con Mockito
@Test
public void testConSpy() {
        MyClass spy = ??;

        MyList<int> SUT = new MyList<int>();

        res = SUT.somma(spy);

        assertThat(set).isEqualTo(14);
        // assert che getValue è stata chiamata 3 volte
        // prima una volta con parametro 0 e poi...    
        }
@Test 
public void testConSpy() {
     MyClass spy = spy(new MyClass());

     MyList<int> SUT = new MyList<int>();

     res = SUT.somma(spy);
     
     assertThat(res).isEqualTo(14); 
     InOrder io = inOrder(spy); 
     io.verify(spy).getValue(0); 
     io.verify(spy, times(2)).getValue(1);
}