2016-04-04 38 views
0

Kısa bir süre önce Scala'da programlama yapmaya başladım. Birbirini arayan sınıf hiyerarşisi olan bir projem var. Sonunda, bir tanesi MySQL'de saklı bir prosedürü çağıran bir singleton DAL (Veri Erişim Katmanı) nesnesi çağırır.Tek bir nesneye alay etmek için Scala'daki alaylarda nasıl kullanılır?

aşağıdaki imzası ile bir DAL nesnesi vardır:

def callStoredProcedure(procName: String, params: Array[String]): Boolean

Ben üst düzey sınıfının işlevini çağıran bir test yazmak ister ve procName geçildi ne denetler ediyorum işlevi.

DAL nesnesi için alay oluşturma hakkında nasıl giderim? Proses boru hattına nasıl enjekte edebilirim ya da singleton'u çağırmak yerine prosedür ismini veren bir alayla değiştirmenin daha iyi bir yolu var mı?

Şu anda Mockito kullanıyoruz, ama her şeye açıktır.

cevap

1

Singletons'u doğrudan kullanmayın, bu iyi bir fikir değildir. Neden biliyormusun? Çünkü ünite testleri için alay edemezsin, ahh.

trait DAL { 
    def callStoredProcedure(procName: String, params: Array[String]): Boolean  
} 

object DALImpl extends DAL { 
    def callStoredProcedure(procName: String, params: Array[String]): Boolean = doStuff 
} 

class Foo(dal: DAL = DALImpl) 

val testMe = new Foo(mock[DAL]) 

veya

class Foo { 
    def dal: DAL = DALImpl 
} 

val testMe = new Foo { 
    override def dal = mock[DAL] 
} 
0

Sen yapabilirsin:

class Foo(dal: DAL) 

val testMe = new Foo(dal = mock[DAL.type]) 

Alkış

+0

o yardım, Nasıl isteyebilir eğer yerine Sınıfınızda bir parametre olun ? Depolanmış proc adını, aslında çağrılmadan almak istiyorum. Casusluk bunu yapmayacak. Mocking hala tüm katmanlarda bir enjeksiyon gerektirecektir. Yanlışsam düzelt? –

+0

Evet, gerçekten 'alay [DAL.type]', Dima'nın size gösterdiği gibi bir özellik ile uğraşmak zorunda kalmadan enjeksiyon gerektirecektir. casusluk (DAL) 'aslında aslında sizin için uygun değildir, çünkü aslında işlevi hesaplayacaktır. Cevabımı düzenliyorum. – Joan