Soru Grails: Test sırasında dahili olarak çağrılabilen bir sınama altında sınıfın diğer yöntemlerini nasıl kullanırım?


Aşağıda verilene benzer bir hizmet sınıfında methodA () için bir test yazıyorum.

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

  def methodB(){
  }
}

MethodA () yöntemini test ettiğimde, methodA () yöntemini test ederken, methodB () yöntemine çağrı yapabilmem gerekir. Sürüm 2.0.x grails kullanıyorum. 1.3.x dağılımlarında, böyle bir alay yazarım.

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

Ancak bu, 2.0.x sürümlerinde çalışmaz. MethodA () 'yı test ederken methodB () ile alay etmenin diğer yollarının neler olduğunu merak ediyordum.


19
2018-04-18 06:19


Menşei


Spoils ile Grails 3.2.8 için bunu nasıl yaptığını bilen var mı? - nbkhope


Cevaplar:


Bu tür bir problem için aslında sahtekarlardan sakındım ve yerleşik groovyProxy yeteneğini bir proxy nesnesi olarak bir kapanış haritası oluşturmaya çalışıyorum. Bu, bazı yöntemleri geçersiz kılan bir örnek verir, ancak diğerleri gerçek sınıfa geçmiştir:

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()

Bunun sadece bir örneği değiştirdiğimi, tek bir satırda yapılabileceğini ve bu örnek dışında temizlenecek olan şeyin dışındaki herhangi bir şeyin meta-sınıfını karıştırmamayı sevdim.


35
2018-04-18 13:52



Evet, bu alaycı davranışların harika bir yolu gibi görünüyor. Ben hala grails 'mockFor () :( kullanarak alay yeteneğini özledim - Ritesh M Nayak
Bu benim serserilerimi test etme sorununu çözdü, çok teşekkürler! - EdgeCaseBerg
Parlak. Bu, benim yaptığım testin Spock kapaklarını yarattığını ve kontrol cihazından döndürülen gerçek değerleri (servis çağrısı alay ederken) gösterememde bana yardımcı oldu. - Domenic D.
Yöntemler parametreler alırsa ne olur? Bunu devam ettirmeye çalışıyorum; groovy.lang.MissingMethodException: No signature of method: ... is applicable for argument types: (java.lang.String, java.lang.String) - Pila


Groovy ile çok alaycı alternatifler var. Bazı belgelerini görebilirsiniz Groovy Mocks, Mocks yerine Haritalar ve Expandos'u kullanma veya Mocks yerine Closures kullanarak.

Örneğinizde, Groovy'nin metaprogramlama yeteneklerini kullanacağım.

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

12
2018-04-18 08:25



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 geçmek, aşırı bir sınav gibi görünmektedir :) - Ritesh M Nayak
Ve metaka da diğer testlere sızar. - Sudhir N
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