2012-03-30 13 views
7

Aşağıdaki kodda, dao.add()'u dao.list() .boyutu() kullanmadan ve bunun tersini test edemem.DAO'da "bul" vb. Kullanmadan "ekleme" nasıl test edilir?

Bu yaklaşım normal mi, yanlış mı? Yanlış ise nasıl geliştirilebilir?

public class ItemDaoTest { 

    // dao to test 
    @Autowired private ItemDao dao; 

    @Test 
    public void testAdd() { 
     // issue -> testing ADD but using LIST 

     int oldSize = dao.list().size(); 
     dao.add(new Item("stuff")); 
     assertTrue (oldSize < dao.list().size()); 
    } 

    @Test 
    public void testFind() { 
     // issue -> testing FIND but using ADD 

     Item item = new Item("stuff") 
     dao.add(item); 
     assertEquals(item, dao.find(item.getId())); 
    } 
} 
+0

Entegrasyon veya birim testlerinden sonra mısınız? – davidfrancis

+0

Sen söyle :) Bu özel senaryoda - sadece sağduyu kullanmak bana daha fazla uyum testi gibi görünüyor. Ama bilirsin, sonuçta sadece DAO'mın çalıştığından emin olmak istiyorum, hepsi bu. – Xorty

+0

Evet, bu bir acıdır. Dao'nun sahip olduğu bağımlılık nedeniyle birim testleri ile sonuçlanabileceğinden emin değilsiniz. Dao nasıl çalışıyor? Kişisel olarak testinizi harici bir db'ye bağımlı hale getirmekten kaçınmaya çalışacağım ve cevaplardan birinde önerildiği gibi db erişim katmanını taklit etmeye veya dalga geçmeye çalışacağım. Gerçek bir db bağımlı entegrasyon testi olarak asla güven verici olmadığını söylemiştim. – davidfrancis

cevap

2

Testinizin yukarıda belirtildiği gibi geçerli entegrasyon testleri olduğunu düşünüyorum, ama Bul ve vice verse'nin testinde Add to add kullanacağım. Bir düzeyde kendi güveninizi en alt seviyeye koymanıza izin vermelisiniz. dışsal bağımlılığınıza entegrasyon. Testlerinizde diğer yöntemlere bağımlılık olduğunu anlıyorum, ancak Add and Find yöntemlerinin doğrulanması çok kolay olan "düşük düzey" yöntemler olduğunu anlıyorum. Temel olarak birbirlerini ters olarak test ettikleri için birbirlerini test ederler. Bir eklenti başarılı olduğunu doğrulayabilir

Bul bulmak için

Ekleme kolayca ön şartları oluşturabilir. Ben de bir başarısızlık sınıf tabanlı birim test için test altında testinizden

0

DAO yöntemlerini test etmek için doğrudan JDBC (Spring'in JdbcTemplate'i kullanarak) kullanıyorum. Yani, DAO yöntemlerini (Hazırda Bekletme tabanı) çağırıyorum ve daha sonra JDBC doğrudan SQL çağrılarını kullanarak onayladım.

+1

Ancak bu test için test edilmemiş JDBC kod satırlarının eklenmesi anlamına gelir ...: | – Xorty

1

TestAdd yönteminizin bir sorunu var: ItemDao.list öğesinin düzgün bir şekilde işlediği varsayımına bağlıdır, ancak ItemDao sınadığınız Sınıftır. Birim testlerinin bağımsız olması gerekiyordu, bu yüzden daha iyi bir yaklaşım kullanmak JDBC -as @Amir dedi - kayıt veritabanında tanıtılmış olup olmadığını doğrulamak için.

Spring'i kullanıyorsanız, JDBCTemplate olanaklarına erişmek ve test gerçekleştirildikten sonra geri alma sağlamak için AbstractTransactionalDataSourceSpringContextTests geçişi yapabilirsiniz.

0

küçük birimi tarafından yakalanmış olmaz bir senaryo düşünemiyorum

bir sınıftır. Neden olduğunu görmek için, teorik olarak, sınıfın her bir yöntemini, tüm diğer yöntemlerden, bunları bypass ederek, kestirerek veya alay ederek, test edebilirsiniz. Bazı araçlar bunu desteklemeyebilir; Bu teori pratik değil, yaptıklarını varsayalım. Öyle bile olsa, böyle şeyler yapmak kötü bir fikir olabilir. Bireysel bir fonksiyonun kendiliğinden belirlenmesi, belirsiz ve anlamsız anlaşılmaz bir şekilde değişecektir. Sadece farklı fonksiyonlar arasındaki etkileşim modelinde, test etmek için kullanabileceğiniz koddan daha basit bir özellik mevcut olacaktır.

Öğe eklerseniz ve bildirilen öğelerin sayısı artarsa, işler çalışır. Eğer bazı şeylerin işleyemediği bir şey varsa, ama yine de tüm etkileşim kalıpları tutulursa, o zaman gerekli olan bazı testleri kaçırıyorsunuz demektir.

İlgili konular