Soru Mockito: Bir yöntemin nasıl doğrulanacağı, yalnızca diğer parametrelere yapılan çağrıları göz ardı ederek kesin parametrelerle bir kez çağrıldı?


Java'da Mockito'yu kullanmak, bir yöntemi nasıl doğrulamak için yalnızca bir kez diğer parametrelere yapılan çağrıları göz ardı ederek kesin parametrelerle çağrıldı?

Basit kod:

public class MockitoTest {

    interface Foo {
        void add(String str);
        void clear();
    }


    @Test
    public void testAddWasCalledOnceWith1IgnoringAllOtherInvocations() throws Exception {
        // given
        Foo foo = Mockito.mock(Foo.class);

        // when
        foo.add("1"); // call to verify
        foo.add("2"); // !!! don't allow any other calls to add()
        foo.clear();  // calls to other methods should be ignored

        // then
        Mockito.verify(foo, Mockito.times(1)).add("1");
        // TODO: don't allow all other invocations with add() 
        //       but ignore all other calls (i.e. the call to clear())
    }

}

Ne yapılmalı TODO: don't allow all other invocations with add() Bölüm?

Zaten başarısız bir şekilde denendi:

  1. verifyNoMoreInteractions(foo);

Hayır! Diğer yöntemlere yapılan çağrılara izin vermez clear().

  1. verify(foo, times(0)).add(any());

Hayır! Bir aramaya izin verdiğimiz hesaba katılmıyor add("1").


20
2017-09-12 14:14


Menşei


Nasıl kullanılır verifyNoMoreInteractions? - SpaceTrucker
sonra "temizlemesi için çağrı () beklenmiyor" diyecektir, ancak add () dışındaki tüm yöntemlere çağrıları görmezden gelmek istiyoruz - Igor Mukhin
Görmezden gelmek, bu durumda test vakasında başarısız olmak istediğiniz anlamına mı geliyor? - hunter
"görmezden gel", "Test sonuçları, orada ne olduğuna bağlı değildir" anlamına gelir. - Igor Mukhin
Şu an düşünebilmemin bir yolu, "1" parametresi parametre olarak iletilirse, bir istisna atmak için alayı değiştirmektir. Düzenleme: aşağıdaki cevap daha iyidir. - mdewit


Cevaplar:


Mockito.verify(foo, Mockito.times(1)).add("1");
Mockito.verify(foo, Mockito.times(1)).add(Mockito.anyString());

İlk verify beklenen parametreli aramayı kontrol eder ve ikincisi verify sadece bir aramanın olduğunu kontrol eder add hiç


33
2017-09-12 14:26



2. veya daha fazla kez yöntem çağrıları eklerseniz, ikinci satır başarısız olur, eğer yöntem farklı bir argümanla yalnızca bir kez çağırırsa ilk satır başarısız olur. Bu nedenle, verilen argümanla bir kere ekleme yönteminin çağrıldığından emin olun, ancak diğer argümanlar ile çağrılmadığından emin olun. - hunter
Bu son satırı ur koduna ekleyin, test başarısız olur. daha sonra foo.add ("1") satırına yorum yapın; . sonra test başarısız olur. sonra uncomment ve yorum yapın foo.add ("2"); sonra test geçecek. tam istediğin şey bu - hunter
Kesinlikle haklısın! Onay işaretini alacaksın! Teşekkür ederim! - Igor Mukhin


Önceki cevap daha da basitleştirilebilir.

Mockito.verify(foo).add("1");
Mockito.verify(foo).add(Mockito.anyString());

Tek parametre verify yöntem sadece bir takma addır times(1)uygulanması.


3
2017-07-08 12:47



Bu sadeleştirme, öncelikli olarak karakter sayısını en aza indirgemekle ilgileniyorsanız değer sağlar. Ancak kabul edilen cevabın da değeri vardır, çünkü bu zamanlara göre daha açık bir ifadedir: Bu yanıttaki kod sadece JavaDoc için #verify'ye bakarak ifade eder. Kabul edilen Cevap, #validate varsayılanlarına aşina olmayan ve başka bir şekilde Javadoc'a bakmak için bir nedene sahip olmayan bir kodlayıcı için daha açık bir şekilde anlaşılabilir. - cellepo