Каковы ограничения метода Grails mockDomain ()? - PullRequest
3 голосов
/ 15 декабря 2010

Я пишу Spock Spec (модульный тест) для Сервиса в Grails 1.3.5, и я столкнулся со следующей ошибкой:

No signature of method: myapp.Thing.findAll() is applicable for argument types: (java.util.LinkedHashMap) values: [[sort:index, order:asc]] Possible solutions: findAll(), findAll(groovy.lang.Closure), find(groovy.lang.Closure), getAll(java.util.List), getAll([Ljava.lang.Object;)

groovy.lang.MissingMethodException: No signature of method: myapp.Thing.findAll() is applicable for argument types: (java.util.LinkedHashMap) values: [[sort:index, order:asc]]
Possible solutions: findAll(), findAll(groovy.lang.Closure), find(groovy.lang.Closure), getAll(java.util.List), getAll([Ljava.lang.Object;)
    at grails.test.MockUtils.addDynamicFinders_closure56(MockUtils.groovy:641)
    at myapp.MyService.getCards(MyService.groovy:8)
    at myapp.MyServiceSpec.getCards returns empty map if no cards or statuses are available(MyServiceSpec.groovy:13)

Ранее этот тест проходил, но произошел сбой, когда я изменил свой Сервис для включения сортировки результатов в методе getThings().

class MyService {
    static transactional = true

    static getThings() {
        Thing.findAll(sort: 'index', order: 'asc')
    }
}

По-прежнему это работает, когда приложение запущено, поэтому я подозреваю, что это ограничение реализации mockDomain().

class MyServiceSpec extends UnitSpec {
    def 'mockDomain has some limits, i suspect'() {
        given:
            mockDomain(Thing)
            def myService = new MyService()
        when:
            myService.getThings()
        then:
            true
    }
}

Таким образом, мой вопрос заключается в том, отличаются ли они в методах, добавленных в класс домена с помощью mockDomain(), в отличие от использования реального класса домена во время выполнения? Если да, то что они?

Ответы [ 2 ]

3 голосов
/ 15 декабря 2010

sort и order являются параметрами критерия Hibernate, они не будут работать с MockDomain() - он не включает Hibernate. К счастью.

Вы можете смоделировать эту findAll() подпись самостоятельно, используя массив instances - второй параметр MockDomain(), ( EDIT ), как это переопределяет findAll(Map) подпись Thing:

List<Thing> thingInstances = []

void setUp() {
    mockDomain(Thing, thingInstances)

    Thing.metaClass.`static`.findAll = { Map m ->
        def result = thingInstances.sort{ it."${m.order}" }
        m.order == 'asc' ? result : result.reverse()
    }
}

( РЕДАКТИРОВАТЬ конец)

Или вы можете сделать это интеграционным тестом, тогда он будет работать целую вечность. Что я не рекомендую.

1 голос
/ 15 декабря 2010

Существует новый подход для насмешливых доменных объектов: http://grails.1312388.n4.nabble.com/New-approach-to-mocking-domain-classes-in-Grails-unit-tests-td2529895.html. Возможно, это поможет вам здесь.

...