2013-05-21 15 views
16

Utilizzando l'esempio più semplice da Mockito's examples page, riesco a eseguire correttamente in JUnit.Verifica semplice di Mockito funziona in JUnit ma non in Spock

Tuttavia, quando eseguo lo stesso test in Spock, fallisce.

JUnit/versione di Java (questo passa):

import org.junit.Test; 

import java.util.List; 

import static org.mockito.Mockito.mock; 
import static org.mockito.Mockito.verify; 

public class SimpleJunitTest 
{ 
    @Test 
    public void basicMockTest() 
    { 
     List mockedList = mock(List.class); 

     //using mock object 
     mockedList.add("one"); 
     mockedList.clear(); 

     //verification 
     verify(mockedList).add("one"); 
     verify(mockedList).clear(); 
    } 
} 

Spock/versione Groovy (questo non funziona):

import static org.mockito.Mockito.mock 
import static org.mockito.Mockito.verify 


class SimpleSpockTest extends spock.lang.Specification 
{ 
    def "Basic Mock Test"() 
    { 
     given: 
      //mock creation 
      List mockedList = mock(List.class); 

     when: 
      //using mock object 
      mockedList.add("one"); 
      mockedList.clear(); 

     then: 
      //verification 
      verify(mockedList).add("one"); 
      verify(mockedList).clear(); 
    } 

} 

Ecco l'errore che ottengo quando il test Spock non riesce:

Condition not satisfied: 

verify(mockedList).add("one") 
|  |   | 
|  |   false 
|  [email protected] (renderer threw  
NullPointerException) 
[email protected] (renderer threw 
NullPointerException) 

at SimpleSpockTest.Basic Mock Test(SimpleSpockTest.groovy:25) 

Qualche idea o suggerimento? Mi piacciono molto Spock e Mockito e spero di farli lavorare bene insieme. Grazie mille!

risposta

17

In parole povere, un blocco allora può contenere solo asserzioni sotto forma di espressioni booleane. Un'espressione di verifica Mockito non si adatta a questo contratto, in quanto restituisce un valore falsy (null, false, 0) quando passa, che viene interpretato come un'asserzione fallita da Spock.

Per risolvere questo problema, è possibile scrivere un metodo di supporto che avvolge le espressioni di verifica e restituisce sempre true oppure è possibile utilizzare il framework di simulazione incorporato di Spock anziché Mockito.

+0

Devo dire che cercavo di evitarlo, ma i falsi messaggi di errore di Spoke sui messaggi di verifica sono davvero impressionanti. –

+0

Grazie. I grandi messaggi di errore sono certamente un marchio di fabbrica di Mockito. Fortunatamente, sto ricevendo regolarmente feedback da Szczepan (creatore di Mockito) su come migliorare i messaggi di errore di Spock, e il più delle volte ascolto ciò che dice. :-) –

+8

Tornerò su questo dopo un po ', visto che ho bisogno di prendere in giro alcuni componenti Spring e ancora non riesco a farlo con Spock Mocks, e ho trovato che 'Mockito.verify (mock). foo (bar) || true' funziona bene per me ed è ragionevolmente leggibile. – chrylis

Problemi correlati