2013-05-21 12 views
16

Korzystając z najbardziej podstawowego przykładu z Mockito's examples page, mogę pomyślnie działać w JUnit.Proste Mockito sprawdza prace w JUnit, ale nie Spock

Jednak po uruchomieniu tego samego testu w Spock, nie powiedzie się.

JUnit/wersja Java (ten przechodzi):

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/wersja Groovy (to się nie powiedzie):

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

} 

Oto błąd pojawia się, gdy test Spock kończy się niepowodzeniem:

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) 

Wszelkie pomysły i sugestie? Bardzo lubię Spocka i Mockito i mam nadzieję, że sprawią, że będą dobrze ze sobą współpracować. Dziękuję Ci bardzo!

Odpowiedz

17

Z grubsza rzecz biorąc, blok-wówczas może zawierać tylko asercje w postaci wyrażeń logicznych. Wyrażenie weryfikacyjne Mockito nie pasuje do tej umowy, ponieważ zwróci wartość fałszu (null, false, 0) po jej przejściu, co jest interpretowane jako nieudane potwierdzenie autorstwa Spocka.

Aby rozwiązać ten problem, możesz napisać metodę pomocnika, która owija się wokół wyrażeń weryfikacyjnych i zawsze zwraca wartość true, lub możesz użyć wbudowanej ramki Spocka zamiast makiety.

+0

Muszę powiedzieć, że starałem się tego uniknąć, ale fałszywe komunikaty o błędach weryfikacji Spoke'a są naprawdę przerażające. –

+0

Dzięki. Wspaniałe komunikaty o błędach są z pewnością znakiem handlowym Mockito. Na szczęście regularnie otrzymuję informację od Szczepana (twórcy Mockito) o tym, jak poprawić komunikaty o błędach Spocka, a przez większość czasu słucham tego, co mówi. :-) –

+8

Wracam do tego po jakimś czasie, ponieważ muszę wyśmiać niektóre komponenty Springa i nadal nie mogę tego zrobić przy pomocy Spocka, i odkryłem, że 'Mockito.verify (udaje). foo (bar) || true' działa dobrze dla mnie i jest rozsądnie czytelny. – chrylis

Powiązane problemy