2010-10-30 5 views
10

veritabanıGrails'de bir etki alanı nesnesinin statik yöntemini nasıl kullanırsınız?

class Foo { 
    /* member variables, mapping, constraints, etc. */ 

    static findByCustomCriteria(someParameter, List listParameter) { 
     /* code to get stuff from the database... */ 

     /* 
      Return value is a map 
      ["one": "uno", "two": "due", "three": "tre"] 
     */ 
    } 

} 

findByCustomCriteria anlamına Foo tablo veri çeker sorgu oluşturmak için createCriteria() kullanan statik işlevi veri almak için özel bir statik işlevi olan bir Grails alan nesne olması mockDomain(Foo) çalışmaz ünite test edildiğinde uygun şekilde. Ben bu etrafında çalışmak için ne yapmaya çalışıyorum findByCustomCriteria alay etmek için alay genel amaçlı yöntemlerden birini kullanmak, ancak sözdizimi oldukça doğru alamıyorum.

Test etmeye çalıştığım bir denetleyici BarController var ve aramaya BarController.someFunction() numaralı aramaya gömdüm Foo.findByCustomCriteria() numaralı çağrı var.

class BarControllerTest extends ControllerUnitTestCase { 

    protected void setUp() { 
     super.setUp() 
    } 

    protected void tearDown() { 
     super.tearDown() 
    } 

    void testSomeFunction() { 

     /* Mocking for Foo goes here */ 

     assertEquals("someValue", controller.someFunction()) 
    } 
} 

Bunun için bir yol ne olurdu?

new MockFor(), mockFor() ve metaClass kullanmayı denedim, ancak çalışamıyorum.


Düzenleme:

bunu dışarı alay etmeye çalıştı her zaman, ben başlangıçta yeterli bilgi içermiyordu galiba ... şöyle

Foo.metaClass.'static'.findByCustomCriteria = { someParam, anotherParam -> 
    ["one": "uno", "two": "due", "three": "tre"] 
} 

onu alay etmeye çalıştı.

Ben bir kereden bu senaryo daha karşılaştığınız
+0

alay ve foo şeyleri ... – hvgotcodes

cevap

14

, sen Foo statik metaclass değiştirmeniz gerekir:

Foo.metaClass.'static'.findByCustomCriteria = { someParameter, List listParameter -> 
    ["one": "uno", "two": "due", "three": "tre"] 
} 

Tipik ben deney düzeneğinde koyacağım, bu yüzden unutma uygulanması gerektiğinde. here Bkz

+0

Yardım için gerek duyduğumuz şeyi bu çözüm işe yaramıyor. Soruyu buna göre güncelliyorum. – haydenmuhl

+0

@haydenmuhl: Çözümü açık bir argümanı içerecek şekilde güncelledim (örtük olarak parametrenin yeterli olacağını varsaymıştım, fakat belki de sorun bu olmayabilir (yani, metod aşırı yük imzası)). Lütfen tekrar deneyin. –

+0

Sizin çözümünüz muhtemelen işe yarayacaktı, ama soruya doğru bilgiyi dahil etmedim. Kullandığım yöntem imzası yanlıştı. Aslında bir nesneyi ve bir listeyi aldı ve iki nesneyi alıyorum. Soruyu güncelleyeceğim. Cevabınızı güncellerseniz, doğru olarak seçerim. – haydenmuhl

4

yılında Grails 2.0 ve üstü, bu

def mockControl = new GrailsMock(MyDomainClass) 
mockControl.demand.static.get() {id -> return null} // Static method 
... 
mockControl.verify() 

gibi GrailsMock sınıfını kullanabilirsiniz.