Grails: сигнатура метода findAll() не применима к типам аргументов: String, ArrayList.

Я новичок в 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)


person hering    schedule 21.09.2010    source источник


Ответы (2)


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

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

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

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

Something.findBySomeNumberLike(searchString)
person xlson    schedule 21.09.2010
comment
отличный и быстрый ответ. Большое спасибо! - person hering; 21.09.2010
comment
Хороший ответ, за исключением того, что динамические средства поиска и другие динамические методы ORM (сохранение, получение, подсчет, ..) высмеиваются, когда вы вызываете mockDomain(Something) в своем модульном тесте, это не совсем верно. Некоторые из этих методов тоже отсутствуют, например FindAllWhereSomeNumberInList. - person Fletch; 21.09.2010
comment
Спасибо, Флетч, я не знал, что это так. Я обновлю ответ, чтобы подумать об этом. Знаете ли вы, есть ли хороший список того, что работает, а что нет? To hering: рад быть полезным :) Я знаю, как сложно бывает найти всю необходимую информацию при работе с новым фреймворком. - person xlson; 21.09.2010

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

person Fletch    schedule 21.09.2010
comment
Я не знал об этом, надо будет проверить. Спасибо за совет! - person xlson; 21.09.2010
comment
Я пробовал, но не смог заставить его работать. Многие зависимости не разрешены. Я пытаюсь протестировать службу, которая имеет findAll с простым запросом и некоторой сортировкой и разбиением на страницы. Как жаль, что это невозможно проверить :( - person hering; 21.09.2010