Grails: нет сигнатуры метода findAll () для типов аргументов: String, ArrayList - PullRequest
2 голосов
/ 21 сентября 2010

Я новичок в Grails и получаю следующую ошибку:
No signature of method: Something.findAll() is applicable for argument types: (java.lang.String, java.util.ArrayList) values: [from Something AS s WHERE s.some_number LIKE ?, [%asdf%]]"

Ошибка возникает при запуске test-app. Это происходит в следующем месте:

SomethingVO[] findBySomeNumber(String searchString) {
     searchString = "%"+searchString+"%"
     return Something.findAll("from Something AS s WHERE s.some_number LIKE ?",[searchString]).collect { 
          new SomethingVO(it);    
     }
}  

Класс Something является доменным объектом:

package some.project.domain

    class Something{

        static belongsTo = [product:Product, productVersion:ProductVersion]

        Long id
        String name
        String someNumber

        static constraints = {
            product (nullable:true)
            productVersion (nullable:true)
        }
    }  

Где ошибка?

(я использую Grails 1.2.4)

Ответы [ 2 ]

4 голосов
/ 21 сентября 2010

findAll не проверяется во время модульного тестирования, и поэтому ваш код не работает.Вам нужно вручную добавить макет для вызова перед запуском теста (mockFor может помочь вам в этом).Это применимо, если вы используете HQL или Критерии (которые я бы порекомендовал вместо чистого HQL).

В качестве альтернативы возможно, что вы можете решить свои проблемы с помощью динамических искателей.Динамические искатели и другие динамические методы ORM (save, get, count, ..) в большинстве случаев (?) Высмеиваются, когда вы вызываете mockDomain(Something) в своем модульном тесте.Они также, как правило, проще в использовании, чем HQL (imho).

Обновление: Спасибо Флетчу за указание на то, что не все динамические искатели являются поддельными.Пример динамического искателя, который не будет смоделирован, таков: Something.findAllWhereSomeNumberInList([1, 2, 3]).

HQL, который вы используете в своем коде, может быть переписан с использованием динамических искателей:

Something.findBySomeNumberLike(searchString)
2 голосов
/ 21 сентября 2010

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

...