2012-04-18 11 views
19

test sırasında dahili olarak adlandırılabilir test altındaki bir sınıfın alay başka yöntemler yapmak nasıl. Ben Yöntemia() sınamakGrails: Ben aşağıda verilen benzer bir hizmet sınıfında Yöntemia için bir test() yazıyorum

Class SampleService { 
    def methodA(){ 
    methodB() 
    } 

    def methodB(){ 
    } 
} 

, ben Yöntemib çağrısına (alay etmek gerekiyor) Yöntemia test ederken(). Sürüm 2.0.x grails kullanıyorum. 1.3.x dağılımları, ben bu

def sampleServiceMock = mockFor(SampleService) 
sampleServiceMock.demand.methodB { -> } 

gibi kendinden taklidi yazardı Ama bu 2.0.x sürümlerinde çalışmaz. Ben Yöntemib alay başka yolları nelerdir merak() Yöntemia test ederken()

+0

Bunu Grails 3.2.8 Spock ile nasıl yapacağını bilen var mı? – nbkhope

cevap

34

. Bu, geçersiz bazı yöntemlerle bir örneğini verir, ama diğerleri gerçek sınıfa geçti:

Ben sadece tek bir satırda yapılabilir bir örneğini değiştirir ve metaclass uğraşma yaptığı gibi
class SampleService { 
    def methodA() { 
     methodB() 
    } 

    def methodB() { 
     return "real method" 
    } 
} 

def mock = [methodB: {-> return "mock!" }] as SampleService 

assert "mock!" == mock.methodA() 
assert "real method" == new SampleService().methodA() 

Temizlenecek bu örneğin dışındaki herhangi bir şeyden.

+1

Evet, bu alaycı davranışların harika bir yolu gibi görünüyor. Ben hala grails 'mockFor() kullanarak alay etme yeteneğini özlüyorum :( –

+0

Bu benim serserileri test sıkıntıları çözdü, çok teşekkürler! – EdgeCaseBerg

+0

Parlak. Bu, Spock kapanışlarını yarattığım kadar test yapmamda bana yardımcı oldu. Denetleyiciden dönen gerçek değerler (bir servis çağrısıyla alay ederken). –

12

Groovy ile alternatifleri alay bir yeri vardır. Groovy Mocks, using Maps and Expandos instead of Mocks veya using Closures instead of Mocks belgelerinin bazı belgelerini görebilirsiniz.

Örneğinizde, Groovy'nin metaprogramlama yeteneklerini kullanacağım. Aslında mocks önlemek ve bir proxy nesnesi olarak kapanışları bir haritasını atmak yerleşik groovyProxy yeteneğini kullanmak sorun bu tür için

void testMethodA() { 
    service = new SampleService() 
    service.metaClass.methodB = { -> return "what you want" } 
    service.methodA() 
    assert "your condition" 
} 
+2

Sonunda bu yaklaşımı alay etmeye çalıştım. Ancak, semantik olarak konuşmak gerekirse, bir sınıfa geçmek için bir sınıfa imza atmak çok zor gibi görünüyor :) –

+0

Ve metacass değişiklikleri diğer testlere de sızıyor. –

+0

Linkler (Groovy Mocks, Mocks yerine Maps ve Expandos'u veya Mocks yerine Closures kullanarak) artık çalışmıyor, lütfen düzeltin veya silin. Teşekkürler. – GSAN

İlgili konular