mocking private static
Mockito'da Alaycı Özel, Statik ve Boşluk yöntemlerini Örneklerle Öğrenin:
Bu uygulamalı dizide Mockito'da Öğreticiler bir baktık farklı Mockito Matchers türleri son öğreticide.
Genel olarak, alaycı özel ve statik yöntemler, alışılmadık alay kategorisine girer.
Özel ve statik yöntemler / sınıflarla dalga geçme ihtiyacı ortaya çıkarsa, bu, kötü bir şekilde yeniden düzenlenmiş kodu gösterir ve gerçekten test edilebilir bir kod değildir ve büyük olasılıkla, çok birim test dostu olarak kullanılmayan bazı eski kodlardır.
Bununla birlikte, PowerMockito gibi (ve doğrudan Mockito tarafından değil) birkaç birim test çerçevesi tarafından Mocking özel ve statik yöntemler için hala destek var.
Bir veritabanı satırını güncellemek gibi temelde hiçbir şey döndürmeyen yöntemler olabileceğinden alaycı 'void' yöntemleri yaygındır (bunu bir girdi kabul eden ve herhangi bir çıktı döndürmeyen Rest API uç noktasının PUT işlemi olarak düşünün).
Mockito, bu makalede örneklerle göreceğimiz boşluk yöntemleriyle alay etmek için tam destek sağlar.
yazılımda regresyon testi nedir
Ne öğreneceksin:
- Powermock - Kısa Bir Giriş
- Özel Yöntemleri Alay Etmek
- Alaycı Statik Yöntemler
- Sahte Boşluk Yöntemleri
- İpuçları & Hileler
- Sonuç
- Önerilen Kaynaklar
Powermock - Kısa Bir Giriş
Mockito için, özel ve statik yöntemleri taklit etmek için doğrudan bir destek yoktur. Özel yöntemleri test etmek için yapmanız gerekenler kodu yeniden düzenleyin korumalı (veya paket) erişimi değiştirmek için statik / son yöntemlerden kaçınmanız gerekir.
Mockito, bana göre kasıtlı olarak bu tür taklitler için destek sağlamaz, çünkü bu tür kod yapılarını kullanmak kod kokuları ve kötü tasarlanmış kodlardır.
Ancak, özel ve statik yöntemler için alay etmeyi destekleyen çerçeveler vardır.
Powermock EasyMock ve Mockito gibi diğer çerçevelerin yeteneklerini genişletir ve statik ve özel yöntemlerle alay etme yeteneği sağlar.
# 1) Nasıl: Powermock bunu, alay özel ve statik yöntemleri, son sınıfları, kurucuları vb. Desteklemek için özel bayt kodu manipülasyonu yardımıyla yapar.
# 2) Desteklenen paketler: Powermock, biri Mockito ve diğeri easyMock için olmak üzere 2 uzantı API'si sağlar. Bu makalenin iyiliği için, Mockito eklentisi ile power mock için örnekler yazacağız.
# 3) Sözdizimi :Powermockito, statik ve özel yöntemlerle alay etmek için bazı ek yöntemler dışında Mockito ile neredeyse benzer bir sözdizimine sahiptir.
# 4) Powermockito Kurulumu
Mockito kütüphanesini gradle tabanlı projelere dahil etmek için dahil edilecek kütüphaneler aşağıdadır:
testCompile group: 'org.powermock', name: 'powermock-api-mockito2', version: '1.7.4' testCompile group: 'org.powermock', name: 'powermock-module-junit4', version: '1.7.4'
Maven için de benzer bağımlılıklar mevcuttur.
Powermock-api-mockito2 - Kitaplığın Powermockito için Mockito uzantılarını içermesi gerekir.
Powermock-modül-junit4 - Modülün PowerMockRunner'ı içermesi gerekir (PowerMockito ile testleri çalıştırmak için kullanılacak özel bir çalıştırıcıdır).
Burada dikkat edilmesi gereken önemli bir nokta, PowerMock'un Junit5 test çalıştırıcısını desteklememesidir. Bu nedenle testlerin Junit4'e karşı yazılması ve testlerin PowerMockRunner ile yapılması gerekir.
PowerMockRunner'ı kullanmak için - test sınıfına açıklama eklenmelidir @RunWith (PowerMockRunner.class)
Şimdi özel, statik ve geçersiz yöntemlerle ayrıntılı olarak alay edelim!
Özel Yöntemleri Alay Etmek
Test edilen bir yöntemden dahili olarak çağrılan özel yöntemleri taklit etmek, belirli zamanlarda kaçınılmaz olabilir. Powermockito kullanılarak bu mümkündür ve doğrulama, 'validPrivate' adlı yeni bir yöntem kullanılarak yapılır.
Hadi alalım birMisal test altındaki yöntem özel bir yöntemi çağırır (bu bir boolean döndürür). Bu yöntemin teste bağlı olarak doğru / yanlış sonucunu döndürmesi için, bu sınıfta bir saplama ayarlanması gerekir.
Bu Örnek için, test edilen sınıf, birkaç arabirim çağrısında ve özel yöntem çağrısında alay edilen bir casus örneği olarak oluşturulur.
Mock Private Method için önemli noktalar:
# 1) Test yöntemi veya test sınıfına @ ile açıklama eklenmelidir PrepareForTest (ClassUnderTest). Bu açıklama, powerMockito'ya belirli sınıfları test için hazırlamasını söyler.
Bunlar çoğunlukla olması gereken sınıflar olacak Bayt kodu değiştirildi . Tipik olarak son sınıflar için, test sırasında alay edilmesi gereken özel ve / veya statik yöntemler içeren sınıflar.
Misal:
@PrepareForTest(PriceCalculator.class)
#iki) Özel bir yöntemde saplama kurmak için.
Sözdizimi - ne zaman (sahte veya casus örneği, 'privateMethodName'). thenReturn (// dönüş değeri)
Misal:
when (priceCalculatorSpy, 'isCustomerAnonymous').thenReturn(false);
# 3) Stubbed özel yöntemi doğrulamak için.
Sözdizimi - validPrivate (mockedInstance) .invoke ('privateMethodName')
Misal:
verifyPrivate (priceCalculator).invoke('isCustomerAnonymous');
Tam Test Örneği: PriceCalculator'ın itemService, userService vb. Gibi bazı bağımlılıkların alay konusu olduğu önceki makalelerden aynı örnekle devam edelim.
Aynı sınıf içinde özel bir yöntemi çağıran ve müşterinin anonim olup olmadığını döndüren - calculatePriceWithPrivateMethod adında yeni bir yöntem oluşturduk.
@Test @PrepareForTest(PriceCalculator.class) public void calculatePriceForAnonymous_witStubbedPrivateMethod_returnsCorrectPrice() throws Exception { // Arrange ItemSku item1 = new ItemSku(); item1.setApplicableDiscount(5.00); item1.setPrice(100.00); double expectedPrice = 90.00; // Setting up stubbed responses using mocks when(priceCalculatorSpy, 'isCustomerAnonymous').thenReturn(false); when(mockedItemService.getItemDetails(123)).thenReturn(item1); // Act double actualDiscountedPrice = priceCalculatorSpy.calculatePriceWithPrivateMethod(123); // Assert verifyPrivate(priceCalculator).invoke('isCustomerAnonymous'); assertEquals(expectedPrice, actualDiscountedPrice); }
Alaycı Statik Yöntemler
Statik yöntemler, özel yöntemler için gördüğümüze benzer şekilde alay edilebilir.
Test edilen bir yöntem aynı sınıftan (veya farklı bir sınıftan) statik bir yöntemi kullanmayı içerdiğinde, bu sınıfı Testten önce (veya test sınıfında) preparForTest açıklamasına dahil etmemiz gerekir.
Statik Yöntemlerle İlgili Önemli Noktalar:
# 1) Test yöntemi veya test sınıfına @ ile açıklama eklenmelidir PrepareForTest (ClassUnderTest). Özel yöntemleri / sınıfları alay etmeye benzer şekilde, bu statik sınıflar için de gereklidir.
#iki) Statik yöntemler için gerekli olan fazladan bir adım - mockStatic (// statik sınıfın adı)
Misal:
mockStatic(DiscountCategoryFinder.class)
# 3) Stub'ı statik bir yöntemde kurmak, herhangi bir yöntemi diğer arabirim / sınıf örnek örneklerinde saplamak kadar iyidir.
Örneğin: GetDiscountCategory () (PREMIUM & GENERAL değerleriyle bir DiscountCategory enum döndürür) DiscountCategoryFinder sınıfının statik yöntemini saplamak için, aşağıdaki gibi basitçe saplama:
when (DiscountCategoryFinder. getDiscountCategory ()).thenReturn(DiscountCategory. PREMIUM );
# 4) Nihai / statik yöntemde sahte kurulumu doğrulamak için validStatic () yöntemi kullanılabilir.
Misal:
verifyStatic (DiscountCategoryFinder.class, times (1));
Sahte Boşluk Yöntemleri
Öncelikle, boş bırakma yöntemlerinin saplanmasını içerebilecek kullanım durumlarının ne olduğunu anlamaya çalışalım:
# 1) Örneğin yöntem çağrıları - işlem sırasında bir e-posta bildirimi gönderir.
Örneğin :İnternet bankacılığı hesabınızın şifresini değiştirdiğinizi varsayalım, değişiklik başarılı olduğunda e-postanız üzerinden bildirim alırsınız.
Bu, müşteriye bir e-posta bildirimi göndermek için bir void yöntemi çağrısı içeren Banka API'sine bir POST çağrısı olarak / changePassword olarak düşünülebilir.
#iki) Void yöntemi çağrısının diğer bir yaygın örneği, bir veri tabanına yapılan, bir miktar girdi alan ve hiçbir şey döndürmeyen güncellenmiş isteklerdir.
Stubbing void yöntemleri (yani hiçbir şey döndürmeyen veya başka bir istisna atan yöntemler) kullanılarak işlenebilir doNothing (), doThrow () ve doAnswer (), doCallRealMethod () işlevleri . Saplamanın test beklentilerine göre yukarıdaki yöntemler kullanılarak kurulmasını gerektirir.
Ayrıca, tüm void yöntem çağrılarının varsayılan olarak doNothing () ile alay edildiğini lütfen unutmayın. Bu nedenle, açık bir sahte kurulum yapılmasa bile GEÇERSİZ yöntem çağrıları, varsayılan davranış hala doNothing () şeklindedir.
Tüm bu işlevler için Örnekleri görelim:
Tüm örnekler için bir sınıf olduğunu varsayalım Öğrenci Puanı Güncellemeleri bir yöntemi olan calculateSumAndStore (). Bu yöntem, skorların toplamını (girdi olarak) hesaplar ve bir geçersiz yöntem updateScores () databaseImplementation örneğinde.
public class StudentScoreUpdates { public IDatabase databaseImpl; public StudentScoreUpdates(IDatabase databaseImpl) { this.databaseImpl = databaseImpl; } public void calculateSumAndStore(String studentId, int[] scores) { int total = 0; for(int score : scores) { total = total + score; } // write total to DB databaseImpl.updateScores(studentId, total); } }
Aşağıdaki örneklerle sahte yöntem çağrısı için birim testleri yazacağız:
# 1) doNothing () - doNothing (), Mockito'daki void yöntem çağrıları için varsayılan davranıştır, yani void yönteminde bir çağrıyı doğrulasanız bile (doNothing () için açıkça bir void ayarlamadan doğrulama yine de başarılı olacaktır)
public void calculateSumAndStore_withValidInput_shouldCalculateAndUpdateResultInDb() { // Arrange studentScores = new StudentScoreUpdates(mockDatabase); int[] scores = {60,70,90}; Mockito.doNothing().when(mockDatabase).updateScores(anyString(), anyInt()); // Act studentScores.calculateSumAndStore('student1', scores); // Assert Mockito.verify(mockDatabase, Mockito.times(1)).updateScores(anyString(), anyInt()); }
DoNothing () ile birlikte diğer kullanımlar
için) Void yöntemi birden çok kez çağrıldığında ve ilk çağrı için - doNothing () gibi farklı çağrılar için farklı yanıtlar ayarlamak ve bir sonraki çağrıya bir istisna atmak istediğinizde.
Örneğin :Taklidi şu şekilde ayarlayın:
Mockito. doNothing ().doThrow(new RuntimeException()).when(mockDatabase).updateScores( anyString (), anyInt ());
b) Void yönteminin çağrıldığı argümanları yakalamak istediğinizde, Mockito'daki ArgumentCaptor işlevi kullanılmalıdır. Bu, yöntemin çağrıldığı argümanların ek bir doğrulamasını sağlar.
ArgumentCaptor ile Örnek:
public void calculateSumAndStore_withValidInput_shouldCalculateAndUpdateResultInDb() { // Arrange studentScores = new StudentScoreUpdates(mockDatabase); int[] scores = {60,70,90}; Mockito.doNothing().when(mockDatabase).updateScores(anyString(), anyInt()); ArgumentCaptor studentIdArgument = ArgumentCaptor.forClass(String.class); // Act studentScores.calculateSumAndStore('Student1', scores); // Assert Mockito.verify(mockDatabase, Mockito.times(1)).updateScores(studentIdArgument.capture(), anyInt()); assertEquals('Student1', studentIdArgument.getValue()); }
# 2) doThrow ()- Bu, test edilen yöntemden void yöntemi çağrıldığında bir istisna atmak istediğinizde kullanışlıdır.
Örneğin:
Mockito.doThrow(newRuntimeException()).when(mockDatabase).updateScores ( anyString (), anyInt ());
# 3) doAnswer ()- doAnswer (), bazı özel mantık yapmak için basitçe bir arayüz sağlar.
Örneğin. Aktarılan bağımsız değişkenler aracılığıyla bazı değerleri değiştirme, normal bir saplamanın özellikle void yöntemleri için döndüremeyeceği özel değerleri / verileri döndürme.
Gösterim amacıyla - 'updateScores () void' yöntemini ' Cevap() ”Ve yöntemin çağrılması gerektiğinde iletilmesi gereken bağımsız değişkenlerden birinin değerini yazdırın.
Kod Örneği:
@Test public void calculateSumAndStore_withValidInput_shouldCalculateAndUpdateResultInDb() { // Arrange studentScores = new StudentScoreUpdates(mockDatabaseImpl); int[] scores = {60,70,90}; Mockito.doCallRealMethod().when(mockDatabaseImpl).updateScores(anyString(), anyInt()); doAnswer(invocation -> { Object[] args = invocation.getArguments(); Object mock = invocation.getMock(); System.out.println(args[0]); return mock; }).when(mockDatabaseImpl).updateScores(anyString(), anyInt()); // Act studentScores.calculateSumAndStore('Student1', scores); // Assert Mockito.verify(mockDatabaseImpl, Mockito.times(1)).updateScores(anyString(), anyInt()); }
# 4) doCallRealMethod ()- Kısmi taklitler, saplamalara benzer (burada bazı yöntemler için gerçek yöntemler çağırabilir ve geri kalanını da devre dışı bırakabilirsiniz).
Void yöntemleri için, mockito, taklidi kurmaya çalışırken kullanılabilecek doCallRealMethod () adında özel bir işlev sağlar. Bunun yapacağı şey, gerçek argümanlarla gerçek void yöntemini çağırmaktır.
Örneğin:
Mockito. doCallRealMethod ().when(mockDatabaseImpl).updateScores( anyString (), anyInt ());
İpuçları & Hileler
# 1) Aynı test yöntemine / sınıfına birden çok statik sınıf dahil etme- PowerMockito'yu kullanma Birden fazla Final Statiği sınıfıyla alay etme ihtiyacı varsa, @ içindeki sınıf isimleri PrepareForTest ek açıklama, bir dizi olarak virgülle ayrılmış değer olarak belirtilebilir (esasen sınıf adlarından oluşan bir diziyi kabul eder).
Misal:
@PrepareForTest({PriceCalculator.class, DiscountCategoryFinder.class})
Yukarıdaki örnekte gösterildiği gibi, hem PriceCalculator hem de DiscountCategoryFinder alay edilmesi gereken son sınıflar olduğunu varsayalım. Bunların her ikisi de PrepareForTest açıklamasında bir sınıf dizisi olarak belirtilebilir ve test yönteminde stub edilebilir.
# 2) PrepareForTest özniteliği Konumlandırma - Bu niteliğin konumlandırılması, Test sınıfına dahil edilen testlerin türü açısından önemlidir.
Tüm testlerin aynı final sınıfı kullanması gerekiyorsa, bu özelliği test sınıfı düzeyinde belirtmek mantıklıdır, bu da basitçe hazırlanan sınıfın tüm Test Yöntemleri için mevcut olacağı anlamına gelir. Bunun aksine, test yönteminde açıklama belirtilmişse, o zaman yalnızca o belirli testler için kullanılabilir olacaktır.
Sonuç
Bu eğiticide, statik, son ve geçersiz yöntemlerle alay etmek için çeşitli yaklaşımları tartıştık.
Çok sayıda statik veya nihai yöntem kullanmak test edilebilirliği engeller ve yine de, genellikle kullanılmayan eski kod için bile kodda / uygulamada daha fazla güven elde etmek için birim testleri oluşturmaya yardımcı olmak için test etme / alay etme desteği mevcuttur. test edilebilirlik için tasarlanmalıdır.
Statik ve nihai yöntemler için, Mockito'nun kullanıma hazır bir desteği yoktur, ancak PowerMockito gibi kitaplıklar (Mockito'dan büyük ölçüde miras alan) bu tür bir destek sağlar ve bu özellikleri desteklemek için bayt kodu manipülasyonunu gerçekten yapmak zorundadır.
Kutudan çıkan Mockito, boşluk bırakma yöntemlerini destekler ve doNothing, doAnswer, doThrow, doCallRealMethod vb. Gibi çeşitli yöntemler sunar ve testin ihtiyacına göre kullanılabilir.
Sıkça Sorulan Mockito Mülakat Sorularının çoğu bir sonraki eğitimimizde özetlenmiştir.
PREV Eğitimi | SONRAKİ Eğitici
selenyum css seçici tarafından eleman bul
Önerilen Kaynaklar
- Mockito Eğitimi: Birim Testinde Alay için Mockito Çerçevesi
- En İyi 12 Sahte Görüşme Sorusu (Alaycı Çerçeve Görüşmesi)
- C ++ 'da Statik
- Yöntemler ve Yaşam Döngüsü İçeren Java Konuları
- Mockito'da Kod Örnekleriyle Taklitler ve Casuslar Oluşturma
- Mockito Tarafından Sağlanan Farklı Eşleştirici Türleri
- Kusur Önleme Yöntemleri ve Teknikleri
- Toplu Test Yürütme için SoapUI'de Yöntemler Nasıl Kullanılır - SoapUI Eğitimi # 10