2010-11-15 20 views
19

en test kodu parçası varsayalım: Bir modelde bir yöntem Observable.setChanged() yöntemi çağrılan olmadıysaMockito'nun doğrulama yönteminde jUnit Assert mesaj argümanı gibi bir şeye sahip olmanın bir yolu var mı?

Observable model = Class.forName(fullyQualifiedMethodName).newInstance(); 
Observer view = Mockito.mock(Observer.class); 
model.addObserver(view); 
for (Method method : Class.forName(fullyQualifiedMethodName).getDeclaredMethods()) 
{ 
    method.invoke(model, composeParams(method)); 
    model.notifyObservers(); 
    Mockito.verify(
    view, Mockito.atLeastOnce() 
).update(Mockito.<Observable>any(), Mockito.<Object>any()); 
} 

Mockito.verify yöntem bir istisna atar.

Sorun: loggers/System.print.out eklemeden, sınamada başarısız olan geçerli yöntemin ne olduğunu anlayamıyorum. jUnit Assert yöntemlere benzer bir şey olmasının bir yolu var mı:

Assert.assertEquals(
    String.format("instances %s, %s should be equal", inst1, inst2), 
    inst1.getParam(), 
    inst2.getParam() 
); 

ÇÖZÜM:

verify(observer, new VerificationMode() 
{ 
    @Override 
    public void verify(VerificationData data) 
    { 
    assertTrue(
     format(
      "method %s doesn't call Observable#setChanged() after changing the state of the model", 
      method.toString() 
     ), 
     data.getAllInvocations().size() > 0); 
    } 
}).update(Mockito.<Observable>any(), Mockito.<Object>any()); 

cevap

17

Bu (basit ve net) hile yapar:

try { 
verify(myMockedObject, times(1)).doSomthing(); 
} catch (MockitoAssertionError e) { 
    throw new MockitoAssertionError("Was expecting a call to myMockedObject.doSomthing but got "+ e.getMessage()); 
} 
+6

Nedeni ikinci argüman olarak iletmek, iletiyi birleştirmekten daha iyidir. MockitoAssertionError ("message", e) " – Kapep

+1

MockitoAssertionError parametresine sahip bir kurucunun yok" yeni AssertionError ("message", exception) işlevini kullanıyorum. iddialar için JUnit tarafından atılır. –

3

doğrulamak bir mesaj verir doğrudan API çağrısı yoktur. Ancak, yöntem imzanızı Mockito.any() yöntemi yerine kullanmak için doğrulama imzanızı değiştirirseniz, Yöntem sınıfındaki toString() öğesinin tek tek başlayıp istediğiniz şeyi vereceğini düşünüyorum.

Böyle bir şey.

import static org.mockito.Matchers.anyObject; 
import static org.mockito.Mockito.atLeastOnce; 
import static org.mockito.Mockito.verify; 
import static org.mockito.Matchers.eq; 

... 

Observable model = Class.forName("class name").newInstance(); 

verify(view, times(1)).update(eq(model), anyObject()); 

for (Method method : Class.forName("class name").getDeclaredMethods()) 
{ 
    method.invoke(model, composeParams(method)); 
    model.notifyObservers(); 
    verify(view, atLeastOnce()).update(eq(method), anyObject()); 
} 
+0

İyi denemeydi ama işe gitmiyor. Gözlemci # güncellemesinin ilk yöntemi (Nesne kaynağı, Nesne arg), değişikliği değiştiren yöntemi devleti değiştiren modeldir. –

+0

Sadece görmek istediğiniz beklentiyi ekleyin. Bu başka bir gözlemlenebilir türü içeriyorsa o zaman öyle olsun. –

+0

Sınıf yapınızı daha iyi açıklayan daha fazla kod eklemeniz gerekebilir. –

1

Geçerli yöntemle ilgili bilgileri yazdırmak için eşleştirici oluşturabilirsiniz. Biraz tıkanık olacak, ancak doğrulama başarısız olduğunda yöntem adını yazdırmaya çalışacak.

6

Mockito'da yapamazsınız. Mockito sözdizimi beklenen davranışı test etmeyi çok kolaylaştırır, ancak test durumu kavramı yoktur.

Yapmaya çalıştığınız şey, sahtekarların beklentilerini yerine getirmediğinde alay konusu olmayan nesneye sahip olmaktır. Eğer gerçekten yapmak istiyorsanız

, ben genel olarak 2 şekilde bkz: ya kendi verificationMode arayüzünü

org.mockito.verification; 
public static interface VerificationMode 

uygulanması ve mesajı gösterecektir atLeastOnceMsd (Dize msg) gibi bir yöntemi ekleme oluşturmak modeldeki mevcut test edilen yöntemin örneğin iç döngüde benzer bir çizgiyle görüntülenmesi veya mevcut test edilen yöntemin

numarasına eklenmesi.

view.setName("now we are testing " + method.getName()); 
İlgili konular