2012-11-14 11 views
7

Bazı kayıtları okuyacak ve bunları bir veritabanına ekleyecek basit bir uygulama yazıyorum. Ekleme mantığını işleyen saklı bir yordam yazdım ve bunu ayrı ayrı test etmeyi planlıyorum. Şimdi, bir iş nesnesini alan ve saklı yordam çağrısı geçiren mantığın bölümü için iyi bir birim sınaması yazmak istiyorum.MySQL saklı yordamını çağıran Java'yı nasıl test etmeliyim?

Ben ne yapmak istiyorum çağrı beklenen parametre değerleri ile yapılır iddia sonra, veritabanı bağlantısının bir taklidini geçmesi olduğunu düşünüyorum : Ancak

Connection dbConnection = makeMockConnection(); // how? 
MyObjectWriter writer = new MyObjectWriter(dbConnection); 
writer.write(someSampleObject); 
// somehow assert that dbConnection called 
// `sp_saveMyObject` with param values x, y, and z 

, bu işin çok gibi görünüyor java.sql.Connection'un içinde kazın, nasıl çalıştığını anlayın, sonra tüm sonuçları alay edin. Bütün bunları benim için yapan bir test kütüphanesi var mı? Buna yanlış yoldan mı geliyorum?

+0

Bir yöntem çağrılıp çağrılmadığını kontrol etmek için bağlantıyı yapmak gerçekten çok kolay. [Mockito] (http://code.google.com/p/mockito/) – Kai

+0

ile aşina olmalıyım İş mantığını belirli bir şekilde çalıştırmaktan kaçınmaya çalışıyorum - 'Connection.createStatement' diyebilirim ya da 'Connection.prepareStatement' veya' Connection.prepareCall' veya 'Connection.nativeSql', bunlardan biri * doğru * (veriler veriye geçtiğinden). Bu şeylerin hepsinden * çıkmamayı veya en azından bu alayları kendim yazmamdan kaçınmaya çalışıyorum. – Coderer

cevap

2

Sahte bellek yordamı olan bir bellek içi HSSQL veritabanı oluşturabilirsiniz. Sahte spro, koştuğunu ve parametrelerinin ne olduğunu göstermek için bir tabloya satır ekler. Kodu test altında çalıştırın ve ardından ne olduğunu görmek için db'ye bakın.

+0

Bu, koşu testlerinde ne kadar ek yük oluşturur? Şu anda testlerimin geri kalanı birkaç milisaniyede çalışabilir - standup/teardown süresi anlamlı mı? – Coderer

+1

Hiç zamanlamadım ama oluşturduğu geçici dosyalar nedeniyle bir kaç 10 ms'lik bir sanırım. Bu tip testlerden sadece bir avuç varsa, endişelenmeyeceksin. Eğer binlerce olsaydın yapabilirsin. Tabloyu, aralarında temizledikçe, aynı db örneğini her zaman bir dizi testte paylaşabilirsiniz. Ben korkunç bir lot test etmek için bellek dbs kullanın ve basitlik kazanmak çok infaz yürütme süresi ağır basar. Herhangi bir kodu değiştirmek zorunda değilsiniz, sadece farklı bir jdbc bağlantı dizgesini iletin. Bu büyük bir avantaj. – AutomatedMike

+0

Bu işe başlamak için basit bir rehber bulma konusunda biraz sorun yaşıyorum - HSQLDB dokümantasyonu yüzlerce sayfadır ve HSQLDB ile birim testi hakkında bulabildiğim blog gönderilerinin çoğu Hazırda Bekletme/İlkbahar. Sadece bir veritabanı başlatmam, bir tablo ve saklı bir prosedür eklemem gerek, sonra işim bittiğinde onu yırtıyorum. Bu kolay olmalı, değil mi? – Coderer

0

Bağlantı alay için Dekoratör tasarım desenini kullanabilirsiniz. Bağlantı arabirimini uygulayan ve gerçek bağlantıyı üye olarak tutan ConnectionImpl sınıfı tarafından sarılmış kullandığınız sürücü ile DB için gerçek bir bağlantı oluşturursunuz.
Gerçekte yapmak istemediğiniz her gerçek çağrı, bir sahte kod ile değiştirin ve her çağrı, gerçek bağlantı nesnesinin aynı yöntemi (Aramayı devredin) çağırır.
Bu şekilde, her zamanki gibi kodlarsınız, yalnızca döndürülen nesnede bağlantıyı oluşturan yöntemden farklıdır.
Şimdi, sahte nesnede (ConnectionImpl), örneğin girişi kontrol eden birim test kodu ekleyebilirsiniz.

+0

Burada sorun şu ki, OP hakkındaki yorumumda söylediğim gibi, Bağlantının bağırsaklarını incelememeye çalışıyorum. Sarıcı, kontrol etmek için * ne * olduğunu bilmek zorundadır, aynı şeyi gerçekleştirmenin 4 ya da 5 farklı yolu arasında yürütmenin hangi noktasında yaygındır. Yol, @ AutomatedMike'ın cevabından daha çok iş. – Coderer

0

MyObjectWriter'un nasıl çalıştığından endişe duymuyorsanız, sadece bir entegrasyon testi yazmayı ve bir birim testi yapmayı unutmuş olurdum.

Saklı yordamı nasıl denediğinizden bahsetmiyorsunuz, bu yüzden beni affet, ama ne yapacağımı bir veritabanında gerçek saklı yordamı çağırmak ve daha sonra veritabanı durumunu doğrulamak için MyObjectWriter etrafında sınama testleri yazmaktır. Test sürelerini düşürmek için mümkünse bir bellek içi veritabanı kullanırdım.

İlgili konular