2011-03-06 11 views
5

Denetleyicinin servis yöntemini doğru argümanlarla çağırdığını test etmek istiyorum. Bunu yapmanın en iyi yolu nedir?Grails mockFor ve Yöntemi Test Etmenin En İyi Yöntemi Doğru Bağımsız Değişkenlerle Arandı

Geçerli planım, mockFor'u kullanmak ve sonra da geçiş sırasında geçirilen değeri kontrol etmektir. Aynı yöntemi gerçekleştirmek için mockito ile yapabildiğim şeye benzer alaylı nesne veya mockFor aracılığıyla testi yapmak için daha iyi bir yol var mı? argüman değeri testi çağırmak?

class HappyControllerTests extends ControllerUnitTestCase { 
     : 
    void testSomeValue() { 
     def mockControl = mockFor(HappyService) 
     def givenSomeItem = null 
     mockControl.demand.serviceMethod(1..99) { String someItem -> givenSomeItem = someItem; } 
     controller.happyService = mockControl.createMock() 

     controller.someAction() 

     mockControl.verify() 
     assertEquals("specific value", givenSomeItem) 
    } 
} 

Teşekkürler! Ben çalışmak daha kolay ve daha güçlü olmasını metaclass şeyler ve as ClassName yerleşik olarak harika buldukça

+0

ben "Ted Naleid" cevabını gibi. Yine de, IMHO büyük mağazalar mockFor'u kullanmalıdır (..) http://grails.org/doc/latest/guide/9.%20Testing.html#9.2 Entegrasyon Testi'ne bakın ... bu yöntemleri kullanarak yaptığınız her türlü değişikliği sağlar. Verilen sınıflara diğer testlere sızmayın .. " – finneycanhelp

cevap

13

Nadiren mockFor kullanmak, bunu yapardım:

void testSomeValue() { 
    def givenSomeItem = null 
    controller.happyService = [ 
     serviceMethod: { String someItem -> givenSomeItem = someItem } 
    ] as HappyService 

    controller.someAction() 
    assertEquals "specific value", givenSomeItem 
} 
+1

Kod örneği için teşekkürler. Bu da birkaç şey olana kadar benim bakış açımdı: 1) Jeff Brown tarafından harika bir sunum yaptım ve onunla konuştum. 2) 'setup()' da, bazen bir sınıfın tüm örnekleri için manipüle edilmiş ve düzgün bir şekilde geri yüklenmemiş metaClass'ı gördüm. Bu, testler boyunca yan etki davranışına neden oldu ve ben neler olup bittiğini avlayan bendim. Öyleyse .. Sadece bir tane enjekte edebilir ve diğerleri için mockFor olabilir nesne alay için Groovy metaClass kullanmak mümkün olsa da, sadece büyük bir Java dükkanında iken mockFor kullanmanızı öneririm. – finneycanhelp

+1

Normalde, bir Sınıftaki metaClass'ı değiştirirseniz, bahsettiğiniz sorunu vurursunuz. Sadece bir örneği değiştiriyorsanız (yukarıdaki örnekte olduğu gibi), hemen hemen her zaman güvenlidir ve değişiklikler yalnızca durum geçerli olduğu sürece yaşayacaktır. Bununla ilgili bir meseleye girdiğim tek şey, bir singleton olan enjekte edilmiş bir yay örneğini taklit ettiğimde. Aynı örnek başka bir yere enjekte edilmişti, bu yüzden testten sonra değişikliklerim atılmadı. İnsanların çok fazla tanıdık olmasalar bile büyük bir Java mağazasında mockFor'un daha iyi olabileceğine tamamen katılmıyorum. –

+0

Bu gerçekten harika – tbruyelle

İlgili konular