2013-02-26 11 views
7

Ho una classe di test (basata su TestNG) in cui utilizzo Mockito.verify per un oggetto spia.Ripristino di Mockito Spy

Questo funziona:

public class Program { 
    @Spy 
    private TestObject testObject; 

    @Test 
    public void test1() { 
     testObject.makeSth(); 
     verify(testObject, only()).someMethodNeedToBeChecked(); 
    } 
} 

Ma ecco:

public class Program { 
    @Spy 
    private TestObject testObject; 

    @Test 
    public void test1() { 
     testObject.makeSth(); 
     verify(testObject, only()).someMethodNeedToBeChecked(); 
    } 

    @Test 
    public void test2() { 
     // Some different scenario 
     testObject.makeSth(); 
     verify(testObject, only()).someMethodNeedToBeChecked(); 
     ... 
    } 
} 

ottengo un'eccezione Mokito che ho più che un'invocazione del someMethodNeedToBeChecked metodo. Certo che ho provato ad aggiungere Mockito.reset(testObject) ma non mi ha aiutato affatto.

Come posso resettare un oggetto spia se devo verificare lo stesso metodo in più test?

+0

ho fatto una domanda simile sopra a http://programmers.stackexchange.com/questions/188299/is-this-an- appropriato uso-di-mockitos metodo-reset-. Solo FYI, anche se quello relativo a un finto non è una spia. –

+0

Dove hai tentato di aggiungere la chiamata a 'reset'? Forse modifica il tuo codice per mostrare il tuo tentativo, ma commentato? –

+0

Ho allegato solo un esempio di prototipo, reset Ho provato a fare in @BeforeMethod \ @BeforeClass, lo stesso con @After, anche prima della verifica - non ha funzionato. Come ho capito è un problema solo con spie e reset è solo per gli oggetti finti. –

risposta

12

Dal Mockito documentation:

Ripristino schernisce (Da 1.8.0)

gli utenti di smart Mockito difficilmente utilizzare questa funzione perché sanno che potrebbe essere un segno di test poveri. Normalmente, non è necessario resettare i tuoi mock, basta creare nuovi mock per ogni metodo di prova. Invece di reset() si prega di prendere in considerazione la scrittura di metodi di test semplici, piccoli e mirati su test lunghi e sovra-specificati. Il primo odore di codice potenziale viene ripristinato() nel mezzo del metodo di prova. Questo probabilmente significa che stai testando troppo. Segui il sussurro dei tuoi metodi di test: "Per favore, mantienici piccoli & incentrati sul singolo comportamento". Ci sono diversi thread su di esso sulla mailing list di mockito.

L'unico motivo per cui abbiamo aggiunto il metodo reset() è quello di rendere possibile il lavoro con i mock iniettati dal contenitore.

Si dovrebbe probabilmente solo ricreare la spia in un @BeforeMethod:

public class Program { 

    private TestObject testObject = new TestObject(); 
    private TestObject spyTestObject; 

    @BeforeMethod 
    public void buildSpy() { 
     spyTestObject = spy(testObject); 
    } 

    @Test 
    public void test1() { 
     spyTestObject.makeSth(); 
     verify(spyTestObject , only()).someMethodNeedToBeChecked(); 
    } 

    @Test 
    public void test2() { 
     // Some different scenario 
     spyTestObject.makeSth(); 
     verify(spyTestObject , only()).someMethodNeedToBeChecked(); 
     ... 
    } 
} 
+0

Non capisco perché tu stia dicendo che ogni test dovrà ora aspettarsi due invocazioni. La spia viene ricostruita prima di ogni metodo di prova. –

+0

Scusa, ho interpretato male la tua risposta :-) –

+0

Grazie, in realtà mi ha aiutato, ma se usi anotations come @InjectMocks e altre hai bisogno di chiamare anche initmocks che non sembrano così belli. –