Etkili Java ( burada genişletilmiş tartışma ) Madde 18 gibi bir iskelet uygulaması var . Soyut olarak tanımlayamadığım "boşlukları doldurmak" için alt sınıf yöntemlerini çağıran 2 genel yöntem methodA () ve methodB () sağlayan soyut bir sınıftır.
Önce somut bir sınıf oluşturarak ve bunun için birim testleri yazarak geliştirdim. İkinci sınıf geldiğinde, ortak davranışları elde edebildim, ikinci sınıfta "eksik boşlukları" uygulayabildim ve hazırdı (tabii ki ikinci alt sınıf için birim testleri oluşturuldu).
Zaman geçti ve şimdi 4 alt sınıfım var, her biri somut uygulamalarına çok spesifik olan 3 kısa korumalı yöntem uyguluyor, iskelet uygulaması ise genel işi yapıyor.
Benim sorunum, yeni bir uygulama oluşturduğunuzda, testleri tekrar yazıyorum:
- Alt sınıf belirli bir gerekli yöntemi çağırıyor mu?
- Belirli bir yöntemin belirli bir açıklaması var mı?
- Beklenen sonuçları A yönteminden alabilir miyim?
- Beklenen sonuçları B yönteminden alabilir miyim?
Bu yaklaşımın avantajlarına bakın:
- Testler yoluyla alt sınıf gereksinimlerini belgeler
- Sorunlu bir yeniden düzenleme durumunda hızlı başarısız olabilir
- Alt sınıfı bir bütün olarak ve genel API'leriyle test edin ("bu korunan yöntem çalışıyor mu?" Değil, "methodA () çalışıyor mu?")
Sahip olduğum sorun, yeni bir alt sınıf için testler temelde bir beyinsiz olmasıdır: - Testler tüm alt sınıflarda hepsi aynıdır, sadece yöntemlerin dönüş tipini değiştirirler (iskelet uygulaması geneldir) ve özellikleri I testin onaylanmış kısmını kontrol edin. - Genellikle alt sınıfların kendilerine özgü testleri yoktur
Testlerin alt sınıfın sonucuna odaklanmasını ve yeniden düzenlemeye karşı korumasını seviyorum, ancak testin uygulanmasının sadece "manuel çalışma" olması beni yanlış bir şey yaptığımı düşündürüyor.
Sınıf hiyerarşisini test ederken bu sorun yaygın mıdır? Bundan nasıl kaçınabilirim?
ps: İskelet sınıfını test etmeyi düşündüm, ama aynı zamanda onu test edebilmek için soyut bir sınıfın alayını oluşturmak garip görünüyor. Ve alt sınıfın beklemediği davranışı değiştiren soyut sınıfa yeniden düzenleme yapmanın bu kadar hızlı fark edilmeyeceğini düşünüyorum. Bağırsaklarım, "bir bütün olarak" alt sınıfını test etmenin burada tercih edilen yaklaşım olduğunu söylüyor, ancak lütfen bana yanlış olduğumu söylemekten çekinmeyin :)
ps2: Google'ı araştırdım ve konuyla ilgili birçok soru buldum. Bunlardan biri Nigel Thorne'dan büyük bir cevabı olan bu , benim durumum onun "1 sayısı" olurdu. Bu harika olurdu, ama bu noktada yeniden düzenleme yapamam, bu yüzden bu problemle yaşamak zorunda kalacağım. Refactor yapabilseydim, her alt sınıfı bir strateji olarak görürdüm. Bu iyi olurdu, ama yine de "ana sınıfı" ve stratejileri test ederdim, ama ana sınıf ve stratejiler arasındaki entegrasyonu bozan herhangi bir yeniden düzenleme fark etmezdim.
ps3: Soyut sınıfı test etmek "kabul edilebilir" diyen bazı cevaplar buldum. Bunun kabul edilebilir olduğuna katılıyorum, ancak bu durumda tercih edilen yaklaşımın hangisi olduğunu bilmek istiyorum (hala birim testlerle başlıyorum)