different types matchers provided mockito
mac'da 7zip dosyaları nasıl açılır
Mockito'da Farklı Eşleştirici Türlerine Giriş.
Mockito'daki Sahte ve Casuslar önceki ayrıntılı eğitimimizde ayrıntılı olarak açıklanmıştır. Mockito eğitim serisi .
Eşleştiriciler nedir?
Eşleştiriciler, belirli bir girdi (ve veya çıktı) yerine, stub'ların / casusların dinlenebileceğine ve stub'lara yapılan çağrıların doğrulanabildiğine bağlı olarak bir giriş / çıkış aralığı / türü belirlediğiniz normal ifade veya joker karakterler gibidir.
Tüm Mockito eşleştiriciler ' Mockito ’ statik sınıf.
Eşleştiriciler, kullanım senaryosuna veya senaryoya bağlı olarak bağımsız tipler olarak argüman girişlerinden belirli değerlere değinerek saplamalar kurmanın kısa yolunun yanı sıra saplamalar üzerindeki çağrıları doğrulayan güçlü bir araçtır.
Ne öğreneceksin:
Mockito'daki Eşleştirici Türleri
Mockito'da genel olarak 2 tür eşleştirici vardır veya kullanım açısından eşleştiriciler aşağıdaki 2 kategori için kullanılabilir:
- Stub kurulumu sırasında Argüman Eşleştiriciler
- Stub'lara yapılan gerçek çağrıları doğrulamak için Doğrulama Eşleştiricileri
Her iki Eşleştirici türü için, yani Argüman ve Doğrulama için, Mockito çok sayıda eşleştirici sağlar (Tıklayın İşte eşleştiricilerin tam listesini almak için).
Argüman Eşleştiriciler
Aşağıdakiler en yaygın kullanılanlardır:
Aşağıdakilerin tümü için, bir TamsayıListeyi test etmeyi düşünelim:
final List mockedIntList = mock(ArrayList.class);
# 1) any () - Herhangi bir nesneyi kabul eder (null dahil).
when (mockedIntList.get( any ())).thenReturn(3);
#iki) herhangi (java dil sınıfı) -
Misal : any (ClassUnderTest.class) - Bu, any () öğesinin daha spesifik bir çeşididir ve yalnızca şablon parametresi olarak bahsedilen sınıf türündeki nesneleri kabul eder.
when (mockedIntList.get( any (Integer.class))).thenReturn(3);
# 3) anyBoolean (), anyByte (), anyInt (), anyString (), anyDouble (), anyFloat (), anyList () ve çok daha fazlası - Bunların tümü, karşılık gelen veri türündeki herhangi bir nesneyi ve boş değerleri kabul eder.
when (mockedIntList.get( any Int())).thenReturn(3);
# 4) Spesifik argümanlar - Gerçek argümanların önceden bilindiği durumlarda, genel argüman türlerine karşı daha fazla güven sağladıkları için bunların kullanılması her zaman önerilir.
Misal:
when(mockedIntList.get(1)).thenReturn(3);
Doğrulama Eşleştiricileri
Hayır gibi şeyler beklemek / öne sürmek için bazı özel eşleştiriciler var. alay üzerine çağrılar.
Aşağıdaki eşleştiricilerin tümü için, daha önce kullandığımız aynı örnek listesini ele alalım.
final List mockedIntList = mock(ArrayList.class);
# 1) Sahte Çağrılar
(ben) Mock'ta basit çağrı, alay edilen listenin boyutunu 5 olarak ayarlayarak, alay edilen yöntemin çağrılıp çağrılmadığını / etkileşimde bulunulmadığını doğrular.
//arrange when(mockedList.size()).thenReturn(5); // act int size = mockedList.size(); // assert verify(mockedList).size();
(ii) Sahte bir yöntemle belirli etkileşim sayısı, hayır sayısını doğrular. çoğu zaman alay çağrılması bekleniyordu.
//arrange when(mockedList.size()).thenReturn(5); // act int size = mockedList.size(); // assert verify(mockedList, times(1)).size();
0 etkileşimi doğrulamak için, times () eşleştirici için bağımsız değişken olarak değeri 1'den 0'a değiştirmeniz yeterlidir.
//arrange when(mockedList.size()).thenReturn(5); // act int size = mockedList.size(); // assert verify(mockedList, times(0)).size();
Arıza durumunda aşağıdaki istisnaları döndürür:
için) Beklenen çağrılar gerçek çağrılardan daha az olduğunda:
Misal: 2 kez aranıyor, ancak 3 kez çağrılıyor, ardından Mockito geri dönüyor - ' doğrulama.TooManyActualInvocations '
Örnek kod:
final List mockedIntList = mock(ArrayList.class); // Arrange when(mockedIntList.get(anyInt())).thenReturn(3); // Act int response = mockedIntList.get(5); response = mockedIntList.get(3); response = mockedIntList.get(100); // Assert verify(mockedIntList, times(2)).get(anyInt());
b) Beklenen çağrılar gerçek çağrılardan daha fazla olduğunda:
Misal: 2 kez aranıyor, ancak 1 kez çağrılıyor, ardından Mockito geri dönüyor - ' doğrulama.TooLittleActualInvocations '
final List mockedIntList = mock(ArrayList.class); // Arrange when(mockedIntList.get(anyInt())).thenReturn(3); // Act int response = mockedIntList.get(5); response = mockedIntList.get(3); response = mockedIntList.get(100); // Assert verify(mockedIntList, times(4)).get(anyInt());
(iii) Alay edilen nesnenin belirli yöntemiyle etkileşim yok.
final List mockedIntList = mock(ArrayList.class); // Arrange when(mockedIntList.get(anyInt())).thenReturn(3); // Act int response = mockedIntList.get(5); // Assert verify(mockedIntList, never()).size();
(iv) Alay edilen etkileşimlerin sırasını doğrulayın - Bu, alay konusu nesneler üzerindeki yöntemlerin çağrılma sırasını sağlamak istediğinizde özellikle yararlıdır.
c ++ uyku ()
Misal: Bir testin, veritabanı güncellemelerinin gerçekleştiği sırayı doğrulaması gereken veritabanı benzeri işlemler.
Bunu Örnekle göstermek için - Aynı örnek listesiyle devam edelim.
Şimdi, yöntemleri listelemek için çağrıların sırasının, yani get (5), size (), get (2) olduğunu varsayalım. Dolayısıyla, doğrulama sırası da aynı olmalıdır.
// Arrange when(mockedIntList.get(anyInt())).thenReturn(3); when(mockedIntList.size()).thenReturn(100); InOrder mockInvocationSequence = Mockito.inOrder(mockedIntList); // Act int response = mockedIntList.get(5); int size = mockedIntList.size(); response = mockedIntList.get(2); // Assert mockInvocationSequence.verify(mockedIntList, times(1)).get(anyInt()); mockInvocationSequence.verify(mockedIntList).size(); mockInvocationSequence.verify(mockedIntList, times(1)).get(anyInt());
Yanlış doğrulama dizisi durumunda, Mockito tarafından bir istisna atılır - ör. ' doğrulama.VerificationInOrderFailure ”.
Dolayısıyla, yukarıdaki örnekte, son 2 satırı değiştirerek doğrulama sırasını değiştirirsem, VerificationInOrderFailure istisnası almaya başlayacağım.
// Arrange when(mockedIntList.get(anyInt())).thenReturn(3); when(mockedIntList.size()).thenReturn(100); InOrder mockInvocationSequence = Mockito.inOrder(mockedIntList); // Act int response = mockedIntList.get(5); int size = mockedIntList.size(); response = mockedIntList.get(2); // Assert mockInvocationSequence.verify(mockedIntList, times(1)).get(anyInt()); mockInvocationSequence.verify(mockedIntList, times(1)).get(anyInt()); mockInvocationSequence.verify(mockedIntList).size();
(v) Etkileşimin en az / en çok kez gerçekleştiğini doğrulayın.
(kime) en azından:
Misal: atleast (3) - Alay edilen nesnenin test sırasında en az üç kez çağrıldığını / etkileşime girdiğini doğrular. Dolayısıyla, 3 veya 3'ten büyük etkileşimlerden herhangi biri doğrulamayı başarılı hale getirmelidir.
// Arrange when(mockedIntList.get(anyInt())).thenReturn(3); // Act int response = mockedIntList.get(5); response = mockedIntList.get(2); // Assert verify(mockedIntList, atLeast(2)).get(anyInt());
Hata durumunda, yani gerçek çağrılar eşleşmediğinde, times () eşleştiricisinde olduğu gibi aynı istisna atılır, yani ' doğrulama.TooLittleActualInvocations '
(b) atmost:
Misal: atmost (3) - alay konusu nesnenin test sırasında en az üç kez çağrılıp / etkileşime girip girmediğini doğrular. Bu nedenle, sahte ile 0,1,2 veya 3 etkileşimden herhangi biri, doğrulamayı başarılı hale getirmelidir.
// Arrange when(mockedIntList.get(anyInt())).thenReturn(3); // Act int response = mockedIntList.get(5); response = mockedIntList.get(2); // Assert verify(mockedIntList, atMost(2)).get(anyInt()); verify(mockedIntList, atMost(2)).size();
# 2) Bağımsız Değişken Eşleştirme
Yukarıdaki çağrıda, eşleştiriciler, modelin çağrıldığı bağımsız değişkenleri doğrulamak için bağımsız değişken eşleştiricilerle birleştirilebilir.
- hiç()
- Belirli değerler - Argümanlar önceden bilindiğinde belirli değerlerle doğrulayın.
- AnyInt (), anyString () vb. Gibi diğer bağımsız değişken eşleştiricileri.
İpuçları & Hileler
# 1) Doğrulama sırasında Argüman Yakalamayı Kullanma
Bağımsız Değişken Yakalama doğrulaması tipik olarak, bazı stubbed yöntemlerin kullandığı bağımsız değişkenin doğrudan bir yöntem çağrısı yoluyla iletilmediği, ancak test edilen yöntem çağrıldığında dahili olarak oluşturulduğu durumlarda yararlıdır.
Bu, esasen, yönteminizin davranışı stub olan bir veya daha fazla ortak çalışana bağlı olduğu durumlarda yararlıdır. Bu ortak çalışanlara iletilen argümanlar dahili bir nesne veya tamamen yeni argüman kümesidir.
Ortak çalışanların çağrılacağı gerçek argümanın doğrulanması, test edilen koda büyük bir güven sağlar.
Mockito, doğrulama ile kullanılabilen ArgumentCaptor sağlar ve daha sonra 'AgumentCaptor.getValue ()' çağrıldığında, beklenen argümana karşı gerçek yakalanan argümanı öne sürebiliriz.
Bunu açıklamak için aşağıdaki örneğe bakın:
Aşağıdaki yöntemde, calculatePrice, InventoryModel sınıfına sahip modeldir ve daha sonra güncelleme için InventoryService tarafından kullanılan yöntem gövdesi içinde oluşturulur.
Şimdi, envanterService ile çağrılan bağımsız değişkeni doğrulamak için bir test yazmak istiyorsanız, InventoryModel sınıfı türünde ArgumentCaptor nesnesini kullanabilirsiniz.
Test edilen yöntem:
public double calculatePrice(int itemSkuCode) { double price = 0; // get Item details ItemSku sku = itemService.getItemDetails(itemSkuCode); // update item inventory InventoryModel model = new InventoryModel(); model.setItemSku(sku); model.setItemSuppliers(new String(){'Supplier1'}); inventoryService.updateInventory(model, 1); return sku.getPrice(); }
Test kodu: Envanter hizmetinin doğrulandığı doğrulama adımına bakın, argumentCaptor nesnesi, eşleştirilmesi gereken bağımsız değişkenle değiştirilir.
Ardından, ArgumentCaptor nesnesinde getValue () yöntemini çağırarak değeri basitçe ileri sürün.
Misal: ArgumentCaptorObject.getValue ()
public void calculatePrice_withValidItemSku_returnsSuccess() { // Arrange ItemSku item1 = new ItemSku(); item1.setApplicableDiscount(5.00); item1.setPrice(100.00); CustomerProfile customerProfile = new CustomerProfile(); customerProfile.setExtraLoyaltyDiscountPercentage(2.00); double expectedPrice = 93.00; // Arrange when(mockedItemService.getItemDetails(anyInt())).thenReturn(item1); ArgumentCaptor argCaptorInventoryModel = ArgumentCaptor.forClass(InventoryModel.class); // Act priceCalculator.calculatePrice(1234); // Assert verify(mockedItemService).getItemDetails(anyInt()); verify(mockedInventoryService).updateInventory(argCaptorInventoryModel.capture(), eq(1)); assertEquals(argCaptorInventoryModel.getValue().itemSku, item1);
ArgumentCaptor olmadan, servis çağrısının hangi argümanla yapıldığını belirlemenin bir yolu olamazdı. Mümkün olan en iyi, bağımsız değişkenleri doğrulamak için 'herhangi ()' veya 'herhangi bir (InventoryModel.class)' kullanmaktır.
# 2) Eşleştiricileri kullanırken Genel İstisnalar / Hatalar
Eşleştiricileri kullanırken, izlenmesi gereken belirli kurallar vardır ve bunlar izlenmezse, bir istisna atılmasına neden olur. Karşılaştığım en yaygın şey, saplama ve doğrulama sırasında.
güvenli bir ağ nasıl kurulur
Eğer herhangi bir argumentMatchers kullanıyorsanız ve stubbed metodun birden fazla argümanı varsa, o zaman ya tüm argümanlardan eşleştiricilerle bahsedilmeli, aksi takdirde hiçbirinde eşleştirici olmamalıdır. Şimdi, bu ne anlama geliyor?
Bunu bir senaryo ile anlamaya çalışalım (ve ardından bu senaryo için kod örneği)
- Test edilen yöntemin şöyle bir imzası olduğunu varsayalım -
concatenateString (String arg1, String arg2) - Şimdi stubing yaparken - arg1'in değerini bildiğinizi, ancak arg2'nin bilinmediğini varsayalım, bu nedenle - any () veya anyString () gibi bir argüman eşleştirici kullanmaya ve ilk argüman için bir değer belirterek 'merhaba' gibi bir değer belirlemeye karar verdiniz.
- Yukarıdaki adım uygulandığında ve test yürütüldüğünde, test 'InvalidUseOfMatchersException' adlı bir istisna atar.
Bunu bir Örnek ile anlamaya çalışalım:
Test kodu:
// Arrange when(a gMatcher.concatenateString('hello', anyString())).thenReturn('hello world!'); // Act String response = argMatcher.concatenateString('hello', 'abc'); // Assert verify(argMatcher).concatenateString(anyString(), anyString());
Test edilen sınıf:
public class ArgMatcher { public String concatenateString(String arg1, String arg2) { return arg1.concat(arg2); } }
Yukarıdaki test yürütüldüğünde, ' InvalidUseOfMatchersException '
Şimdi, bu istisnanın nedeni nedir?
Bu, parça eşleştiricileri ve parça sabit dizeyi kullanan saplamadır, yani bir bağımsız değişken eşleştiriciden 'merhaba' ve ikinci olarak anyString () olarak bahsettik. Şimdi bu tür istisnalardan kurtulmanın 2 yolu vardır (Ayrıca lütfen unutmayın - bu davranış hem Mock kurulumları hem de davranış için geçerlidir).
# 1) Tüm bağımsız değişkenler için Bağımsız Değişken Eşleştiricileri kullanın:
// Arrange when(a gMatcher.concatenateString(anyString(), anyString())).thenReturn('hello world!'); // Act String response = argMatcher.concatenateString('hello', 'abc'); // Assert verify(argMatcher).concatenateString(anyString(), anyString());
# 2) Argüman Eşleştirici olarak argümanın bilindiği yerde eq () kullanın. Bu nedenle, bağımsız değişkeni 'merhaba' olarak belirtmek yerine, onu 'eq (' merhaba ') olarak belirtin ve bu, saplama işlemini başarılı kılacaktır.
// Arrange when(argMatcher.concatenateString(anyString(), eq('world'))).thenReturn('hello world!'); // Act String response = argMatcher.concatenateString('hello', 'world'); // Assert verify(argMatcher).concatenateString(anyString(), eq('world'));
Sonuç
Bu makalede, Mockito tarafından sağlanan farklı eşleştiricilerin nasıl kullanılacağını gördük.
Burada en çok kullanılanları ele aldık. Tam listeye atıfta bulunmak için, Mockito Kütüphanesi belgeleri iyi bir başvuru kaynağıdır.
Private, Static ve Void Mocking yöntemleri hakkında daha fazla bilgi edinmek için yaklaşan eğitimimize göz atın.
PREV Eğitimi | SONRAKİ Eğitici
Önerilen Kaynaklar
- Mockito'da Kod Örnekleriyle Taklitler ve Casuslar Oluşturma
- Mockito Eğitimi: Birim Testinde Alay için Mockito Çerçevesi
- Yazılım Projelerinde Risk Türleri
- Python Veri Türleri
- C ++ Veri Türleri
- En İyi 12 Sahte Görüşme Sorusu (Alaycı Çerçeve Görüşmesi)
- Mockito Kullanarak Özel, Statik ve Geçersiz Yöntemleri Alay Etmek
- C ++ 'da Kalıtım Türleri