2013-02-26 17 views
7

Mam klasę testową (opartą na TestNG), w której używam obiektu Mockito.verify dla obiektu szpiegowskiego.Resetowanie szpiega Mockito

to działa:

public class Program { 
    @Spy 
    private TestObject testObject; 

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

ale tutaj:

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

otrzymuję wyjątek Mokito że mam więcej niż jeden wywołanie someMethodNeedToBeChecked metody. Oczywiście próbowałem dodać Mockito.reset(testObject), ale nie pomogło mi to wcale.

Jak mogę zresetować obiekt szpiegowski, jeśli muszę zweryfikować tę samą metodę w kilku testach?

+0

zadałem podobne pytanie na co http://programmers.stackexchange.com/questions/188299/is-this-an- Odpowiednio wykorzystana metoda resetowania mockitos. Tylko FYI, chociaż dotyczyło to szyderstwa, a nie szpiega. –

+0

Gdzie próbowałeś dodać wywołanie "reset"? Może edytować swój kod, aby pokazać swoją próbę, ale skomentował? –

+0

Załączam tylko prototypowy przykład, reset, który próbowałem wykonać w @BeforeMethod \ @BeforeClass, taki sam z @After, nawet przed weryfikacją - to nie zadziałało. Jak rozumiem jest to problem tylko ze szpiegami i resetem jest tylko dla pozorowanych obiektów. –

Odpowiedz

12

Z Mockito documentation:

Przywracanie mocks (od 1.8.0)

użytkowników Inteligentne Mockito ledwie korzystać z tej funkcji, ponieważ wiedzą, może to być oznaką słabych testów. Zwykle nie trzeba resetować swoich prób, po prostu tworzyć nowe mocks dla każdej metody testowej. Zamiast resetowania(), rozważ pisanie prostych, małych i skoncentrowanych metod testowania w długich, nadmiernie określonych testach. Pierwszy potencjalny zapach kodu jest resetowany() w środku metody testowej. To prawdopodobnie oznacza, że ​​testujesz za dużo. Podążaj za szeptem swoich metod testowych: "Proszę, zachowaj nas małym & skupionym na pojedynczym zachowaniu". Na liście mailingowej mockito jest kilka wątków.

Jedynym powodem, dla którego dodaliśmy metodę reset(), jest umożliwienie pracy z mockami z wtryskiem kontenerowym.

Powinieneś chyba tylko odtworzyć szpiega w A @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

Nie rozumiem, dlaczego mówisz, że każdy test będzie teraz wymagał dwóch inwokacji. Szpieg jest odbudowywany przed każdą metodą testu. –

+0

Przepraszam, błędnie przeczytałem twoją odpowiedź :-) –

+0

Dzięki, właściwie to mi pomogło, ale jeśli używasz anotations takich jak @InjectMocks i innych, musisz również wywołać tam initmocks, które wydają się nie takie piękne. –