Как вы макете статический метод доменного объекта в Grails? - PullRequest
10 голосов
/ 30 октября 2010

имеет объект домена 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"]
        */
    }

}

Статическая функция findByCustomCriteria использует createCriteria() для построения запроса, извлекающего данные из таблицы Foo, что означает, что mockDomain(Foo) не работает должным образом при модульном тестировании. То, что я пытаюсь сделать, чтобы обойти это, - это использовать один из универсальных методов насмешки для макетирования findByCustomCriteria, но я не могу понять синтаксис совершенно правильно.

У меня есть контроллер BarController, который я пытаюсь проверить, и похоронен в вызове на BarController.someFunction(), есть вызов на 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())
    }
}

Как бы это можно было смутить?

Я пытался использовать new MockFor(), mockFor() и metaClass, но не могу заставить его работать.


Edit:

Каждый раз, когда я пытался издеваться над этим, я пытался издеваться над этим так ...

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

Полагаю, я изначально не включил достаточно информации.

Ответы [ 2 ]

14 голосов
/ 30 октября 2010

Я сталкивался с этим сценарием не раз, вам нужно изменить статический метакласс Foo:

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

Обычно я помещаю его в тестовую настройку, поэтомуЯ не забываю, когда это нужно применять.

4 голосов
/ 04 сентября 2012

В Grails 2.0 и выше вы можете использовать GrailsMock класс, подобный этому

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

См. здесь .

...