Geçersiz bir yöntemi test eden birim


15

Bir uygulamadaki bir hatayı düzeltmek için, adlandırılmış postLoginmevcut bir yönteme çağrı ekleyerek adlandırılmış bir yöntemi değiştirdim getShoppingCart.

kod

protected void postLogin() {
  getShoppingCart();
}

Ancak, birim testi yazmanın en iyi yolunun ne olduğundan emin değilim postLogin.

Yaklaşım 1

Yöntemin çağrıldığını doğrulamak için Mockito'dan doğrulamayı kullanın.

verify(mock).getShoppingCart();

Yaklaşım 2

Kullanıcının alışveriş sepetinin değerini getirerek yöntem çağrısının yan etkisini test edin.

AssertNotNull(user.getShoppingCart());

Bir yaklaşım diğerinden daha mı iyi?


1
hangisi testin anlaşılmasını kolaylaştırır ve kodu temiz tutar. Eğer test tasarımı emin değilseniz, o OLABİLECEK da kod tasarım kapalı olduğunu bir işareti olabilir. Emin olun bu soruları soruyorsunuz: " NEDEN O yöntem çağrısı Fix hata ekleyerek mu bu mu? SAĞ bu hatayı düzeltmek için bir yol?"
Caleb

8
Metodunuzun getShoppingCart()yan etkileri olmadığı sürece, bunun denendiğini test etmenize gerek yoktur. Yan etkileri varsa, adını gerçekten değiştirmelisiniz, çünkü getXXX()geleneksel olarak yöntemler idempotent olmalıdır.
Jules

@Jules getNextValue? Tartışmalı olarak, birisi "Buna alıcı deme; adını değiştir nextValue" diyebilirdi, ama daha önce getNextkullanıldığını gördüm . Belki daha iyi bir örnek, bir elektronu temsil eden bir nesne olabilir; aradığımda ne olur getPosition? Veya daha da kötüsü,getPosition(); getVelocity();
Aaron

Yanıtlar:


18

Genellikle yöntem 2'yi tercih ederim.

Neden? postLoginSisteminizin bazı durumunu değiştirmek istediğiniz için, ancak bunu nasıl başardığı (ve bunun için dahili olarak çağırdığı yöntemler) sadece bir uygulama detayıdır, ünite testinizin herhangi bir varsayımda bulunmaması gerekir. Testinizin son durumu doğrulaması daha iyi olur.


4

GetShoppingCart, initializeShoppingCart gibi bir şeye değiştiririm, yöntemin amacı, yöntemin ne yaptığını kontrol etmeden kimin okuduğuna açık olmalı ve bu gibi yan etkiler, yöntemin kullanıcıları için bazı şaşırtıcı davranışlara neden olabilir.

GetShoppingCart başka bir sınıftaysa ve zaten birim test edilmişse, yaklaşım 1'i kullanırım - zaten test edilmiş olanları tekrar test etmeye gerek yoktur. Bu durumda, getShoppingCart'ın düzgün çalıştığından eminiz ve yalnızca postLogin'den çağrıldığından emin olmak istiyoruz, bu nedenle gelecekte biri bu çağrıyı kaldırırsa test başarısız olur.

GetShoppingCart kendi kendine test edilemeyen özel bir yöntemse, postLogin çağrıldığında getShoppingCart'ın istenen işlevselliğinin beklendiği gibi gerçekleştirildiğinden emin olmak için yaklaşım 2'yi kullanırım.


1

Yan etkisi olan bir işlev çağrısını test ederken (geçersiz veya değil), yan etkinin sadece meydana gelmediğini değil, aynı zamanda yan etkinin (sistem çıktısı veya durum değişikliği) istenen etki olup olmadığını kontrol etmek en eksiksiz yöntemdir.


1
Bu doğru olsa da , ortaya çıkan yan etkinin ayrıntılarının başka bir modülün dahili durumunun bir parçası olabileceğini ve bu ayrıntıları kontrol ederek testinizi yalnızca aşağıdaki modüle değil aynı zamanda bu ayrıntıların değişmesi muhtemelse kırılgan testlere yol açabilecek diğer modülü de test ediyor. Modüller arasındaki arayüzün takılması bu sorunun önlenmesine yardımcı olur.
Jules

0

Ben senin tasarım tartışmak olmaz, ancak birim test sizin yöntem nedir teknik bakılmaksızın etki alanındaki işlerinin ne yöntemleri test için çünkü senin durumunda ilk yaklaşım için gider postLoginmi? Teknik olarak çağırıyor getShoppingCardbu yüzden gerçekten çağırıyor test etmek zorunda getShoppingCard, ben de getShoppingCardne test etmek için başka bir test oluşturmak ve yan etkileri varsa ben bu yeni test içinde kontrol edecektir.


0

PostLogin'de bir hata var. Yapmanız gereken ilk şey, beklenen bilgi kümesi olmadan postLogin çağrıldıktan sonra "başarısız" olacak bir birim testi oluşturmaktır.

Yukarıdaki fikirden, önerilen 2'den başka bir alternatif, alışveriş sepeti hakkındaki bilgileri bir parametre olarak enjekte etmektir. Doğru bilgiye sahip değilseniz, kontrol edilmeyen bir istisna atarsınız. Bu, doğru ayrıntılar olmadan, yönteminizin mahkum olduğunu açıklığa kavuşturacaktır.

Bu, şu anda postLogin'i çağıran müşterinin alışveriş sepeti bilgisini geçmesi gerektiğinde küçük bir değişiklik gerektirecektir. Bana göre bu hala birbirine bağlı olduğunu gördüğünüzde tutarlı. Bu bağlantı arayan tarafından yapılacaktır.

Daha sonra, test altındaki gerçek yöntem postLogin olduğu için getShoppingCart'ı postLogin içinde test etmeniz bile gerekmez. Hataya sahip olan ve uygun düzeltme ve doğrulama gerektiren tek olandır. Enjekte edilen bağımlılıkla, farklı koşullar altında kolayca test edebilecek ve herhangi bir hata atılmadığını teyit edebileceksiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.