2010-09-21 33 views
2

我是新來的Grails並收到以下錯誤:當我運行test-app
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%]]"的Grails:方法的findAll()是適用於參數類型的無簽名:字符串,ArrayList的

出現的錯誤。它發生在以下地方:

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)

回答

4

的findAll單元測試期間不嘲笑,這就是爲什麼你的代碼不能正常工作。在運行測試之前,您需要手動添加一個模擬調用(mockFor可以幫助你)。這適用於如果您使用HQL或Criterias(我會建議使用純HQL)。

或者,您可以使用動態查找器來解決您的問題。當您在單元測試中調用mockDomain(Something)時,動態查找程序和其他動態ORM方法(save,get,count,..)在大多數(?)情況下被模擬。它們通常比HQL(imho)更易於使用。

更新: 感謝Fletch指出並非所有動態發現者都被嘲笑。一個不會被嘲笑的動態查找器的例子是:Something.findAllWhereSomeNumberInList([1, 2, 3])

的你在你的代碼中使用HQL可以改寫像這樣使用動態查找器:

Something.findBySomeNumberLike(searchString) 
+0

偉大而快速的答案。非常感謝你! – hering 2010-09-21 08:45:42

+1

好的答案,除了「在單元測試中調用mockDomain(Something)時,動態查找器和其他動態ORM方法(保存,獲取,計數,..)都被嘲笑」並不完全正確。其中一些方法也缺失,例如FindAllWhereSomeNumberInList。 – Fletch 2010-09-21 08:58:52

+0

謝謝Fletch,我不知道那是真的。我會更新答案以反思這一點。你知道是否有任何有效的清單,哪些不清楚?對於hering:很高興能夠有所幫助:)我知道在使用新框架時能夠找到所需的全部信息是多麼困難。 – xlson 2010-09-21 10:30:35

2

Xlson的答案是正確的,但還存在另一種「前沿」的解決方案,你可以試試,這是目前在測試狀態。見http://grails.1312388.n4.nabble.com/New-approach-to-mocking-domain-classes-in-Grails-unit-tests-td2529895.html

+0

我沒有意識到這一點,將檢查出來。謝謝你的提示! – xlson 2010-09-21 10:44:46

+0

我試過了,但無法使其正常工作。很多依賴沒有解決。我試圖用一個簡單的查詢和一些排序和分頁來測試一個findAll的服務。真可惜,這是不可能測試:( – hering 2010-09-21 11:49:51

相關問題