2013-11-20 11 views
7

Aşağıdaki kodu:Bir Mockito alayının sırayla farklı eylemler gerçekleştirmesini nasıl sağlayabilirim?

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

beklenen çıkışı

İSTİSNA

doğru?

ama hiçbir şey elde

Sonra ben almak DoNothing sonra doThrow yaparsanız

İSTİSNA
İSTİSNA öyle son sahte olduğu gibi

Yani görünüyor Alınan o sırada ... alayları kayıt oldukları sırada almayı düşündüm. Ben bir taklidini üretmek için arıyorum

cevap

15

mockito aynı olan ardışık davranışı saplama parametrelerin-sonsuza nihai talimat-ama hepsi var tekrarlayarak ... istisna ilk kez atar ve normal ikinci kez tamamlar Aynı "zincirin" parçası olmak. Aksi halde, Mockito etkin bir şekilde fikrinizi değiştirdiğinizi ve önceden alay konusu davranışınızın üzerine yazdığını düşünür. Bu, setUp veya @Before yönteminde iyi varsayılanlar oluşturduysanız ve belirli bir test durumunda bunları geçersiz kılmak istiyorsanız kötü bir özellik değildir.

"mockito eylem sonraki gerçekleşecek olan" için genel kurallar:tüm argümanları maçları zincir seçilecektir en-son-tanımladı. Zincir içinde, her eylem bir kez gerçekleşir (thenReturn(1, 2, 3) gibi verilirse çoklu thenReturn değerleri sayılır) ve son eylem sonsuza dek yinelenir. Eğer Mockito.doThrow ve için statik ithalat kullanabilirsiniz

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

Not:

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

Bu

doğru bir şekilde void yöntemi için buraya kaçınılması daha-ortak when sözdiziminde zincirleme thenVerb tabloların, eşdeğerdir Matchers.*, ve (OutputStream) anyObject() yerine any(OutputStream.class)'a geçin ve şu şekilde hava edin:

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

Zincirleyebileceğiniz komutların tam listesi için Mockito's documentation for Stubber'a bakın.

+1

Onları zincirlemek zorunda olduğumu farketmedim ... ;-) –