2013-11-20 5 views
7

Poniższy kod:Jak wykonać makietę Mockito, wykonać kolejno różne akcje?

ObjectMapper mapper = Mockito.mock(ObjectMapper.class); 
    Mockito.doThrow(new IOException()).when(mapper).writeValue((OutputStream) Matchers.anyObject(), Matchers.anyObject()); 
    Mockito.doNothing().when(mapper).writeValue((OutputStream) Matchers.anyObject(), Matchers.anyObject()); 

    try { 
     mapper.writeValue(new ByteArrayOutputStream(), new Object()); 
    } catch (Exception e) { 
     System.out.println("EXCEPTION"); 
    } 

    try { 
     mapper.writeValue(new ByteArrayOutputStream(), new Object()); 
    } catch (Exception e) { 
     System.out.println("EXCEPTION"); 
    } 

Oczekiwany wynik jest

WYJĄTEK

prawda?

Ale mam nic

Gdybym wtedy dokonać doThrow po DoNothing uzyskać

WYJĄTEK
WYJĄTEK

więc wygląda na to, że jest to ostatni mock to ten, który jest brany ... Myślałem, że to będzie wymagało drwin w kolejności, w jakiej są zarejestrowane?

szukam produkować makiety rzuca po raz pierwszy wyjątek i kończy zazwyczaj po raz drugi ...

Odpowiedz

15

Mockito może skrótową kolejnych zachowań z tymi samymi parametrami, zawsze powtarzając końcowy wskazówki, ale wszystkie one mają być częścią tego samego "łańcucha". W przeciwnym razie Mockito skutecznie myśli, że zmieniłeś zdanie i nadpisujesz wcześniej wyśmiałe zachowanie, co nie jest złą cechą, jeśli ustanowiłeś dobre wartości domyślne w metodzie setUp lub @Before i chcesz je zastąpić w konkretnym przypadku testowym.

Ogólne zasady „które działania Mockito będzie dalej”:najbardziej niedawno zdefiniowane łańcuch że pasuje do wszystkich argumentów zostanie wybrany. W łańcuchu każda akcja stanie się jednokrotnie (licząc wiele wartości thenReturn podana jako thenReturn(1, 2, 3)), a ostatnia akcja zostanie powtórzona na zawsze.

// doVerb syntax, for void methods and some spies 
Mockito.doThrow(new IOException()) 
    .doNothing() 
    .when(mapper).writeValue(
     (OutputStream) Matchers.anyObject(), Matchers.anyObject()); 

Jest to odpowiednik przykuty thenVerb wypowiedzi w bardziej wspólnej składni when, które poprawnie uniknięto tutaj metodę void:

// when/thenVerb syntax, to mock methods with return values 
when(mapper.writeValue(
     (OutputStream) Matchers.anyObject(), Matchers.anyObject()) 
    .thenThrow(new IOException()) 
    .thenReturn(someValue); 

pamiętać, że można korzystać z importu statycznych dla Mockito.doThrow i Matchers.* i przełącz na any(OutputStream.class) zamiast (OutputStream) anyObject() i kończy się:

// doVerb syntax with static imports 
doThrow(new IOException()) 
    .doNothing() 
    .when(mapper).writeValue(any(OutputStream.class), anyObject()); 

Aby uzyskać pełną listę poleceń, które można połączyć, zobacz Mockito's documentation for Stubber.

+1

Nie zdawałem sobie sprawy, że muszę je powiązać ... ;-) –