2010-10-30 6 views
10

mieć obiektu domeny Grails, który ma zwyczaj statyczną funkcję, aby pobrać dane z bazy danychJak wyśmiewać statyczną metodę obiektu domeny w Grails?

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"] 
     */ 
    } 

} 

Statyczna funkcja findByCustomCriteria wykorzystuje createCriteria() zbudować kwerendę, która pobiera dane z tabeli Foo, co oznacza mockDomain(Foo) nie działa prawidłowo, gdy testowanie jednostkowe. Próbuję to obejść, używając jednej z ogólnych metod szyderstwa, aby wyśmiać findByCustomCriteria, ale nie mogę uzyskać poprawnej składni.

Mam kontroler BarController, który próbuję przetestować, i pochowany w wywołaniu BarController.someFunction() jest połączenie z Foo.findByCustomCriteria().

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

Jaki byłby sposób na wyśmiewanie tego?

Próbowałem już używać new MockFor(), mockFor() i metaClass, ale nie mogę go uruchomić.


Edit:

każdym razem starałem się kpić z tego, próbowałem go wyśmiewać, tak jak ...

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

Chyba nie zawiera wystarczających informacji, początkowo.

+0

położyć drwiny i rzeczy foo w ... to, co musimy zobaczyć, aby pomóc – hvgotcodes

Odpowiedz

14

Napotkałem ten scenariusz więcej niż jeden raz, trzeba zmodyfikować statycznego metaklasa Foo:

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

Zazwyczaj włożę go w konfiguracji testowej, więc nie zapomnij kiedy trzeba go zastosować.

+0

To rozwiązanie nie działa. Odpowiednio aktualizuję pytanie. – haydenmuhl

+0

@haydenmuhl: Zaktualizowałem rozwiązanie tak, aby zawierało wyraźny argument (założyłem, że domyślny parametr będzie wystarczający, ale może nie, co może być problemem (np. Sygnatura przeciążenia metody)). Proszę spróbuj ponownie. –

+0

Twoje rozwiązanie prawdopodobnie by działało, ale nie uwzględniłem odpowiednich informacji w moim pytaniu. Sygnatura metody, której używałam była błędna. Właściwie wziął obiekt i listę, a ja kpiłam z niego jak z dwóch przedmiotów. Zaktualizuję pytanie. Jeśli zaktualizujesz swoją odpowiedź, wybiorę ją jako poprawną. – haydenmuhl

4

w Grails 2.0 i wyżej, można użyć klasy GrailsMock jak ten

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

Zobacz here.