Макет метода для Grails Unit Test - PullRequest
0 голосов
/ 20 июля 2011

В одном из моих модульных тестов у меня возникли некоторые трудности с выполнением смоделированного метода. У меня есть следующий тестовый код:

void testExample() {
    def mockICFService = new MockFor(ICFService)
    ...

    //Mock the methods
    controller.metaClass.icfList = { def person ->
        println "icfList"
        return [new IC(conceptId:'12345')]
    }
    mockICFService.demand.getAllIC(1..1) { def id, def withHist, def appId ->
        println "mocking service"
        return new Person()
    }
    ...

    def model = controller.detail()
}

Внутри деталей в моем классе контроллеров я создаю Person с помощью getFSllvice ICFService (). Эта часть работает правильно. Позже в функции, однако, есть вызов icfList (который определен в контроллере). С помощью println я определил, что вызов все еще выполняется, хотя он возвращает пустой массив. Я полагаю, что это потому, что массив заполняется на основе данных в servletContext, но в модульном тестировании нет доступа к нему (поэтому я пытаюсь его смоделировать).

Кто-нибудь знает, как заставить тест использовать смоделированную версию controller.icfList вместо вызова фактического метода в контроллере?

1 Ответ

1 голос
/ 21 июля 2011

Когда я пробую ваш код, меня бросает в тупик служба, а правильно работающая часть - это метод icfList ().Противоположность твоего наблюдения, интересно.Для чего это стоит, вот что я сделал:

Сначала замените создание нового класса MockFor () на метод mockFor ().Затем вам нужно внедрить фиктивную службу в контроллер.

def mockICFService = mockFor(ICFService)
controller.iCFService = mockICFService.createMock()

Выполнив вышеизложенное, вызываются только ложные версии icfList () и getAllIC (), поэтому вы вообще не используете servletContext,Ознакомьтесь с документацией по тестированию Grails для получения дополнительной информации.

...