2011-06-09 220 views
0

我有困難包含在域這樣的方法進行單元測試:的Grails - 單元測試

這是域類

class UserRole implements Serializable { 

    User user 
    Role role 

     static void removeAll(User user) { 
      executeUpdate 'DELETE FROM UserRole WHERE user=:user', [user: user] 
     } 
} 

然後在服務:

class CorporateUserService { 
    def delete (def cifUserInstance) { 
    def userDetail,users,userRole 
    userDetail=UserDetails.findById(cifUserInstance.userDetails.id) 
    users=User.findById(userDetail.user.id) 
    userRole=UserRole.removeAll(users) 
    } 
} 

並在單元測試中:

void testDelete(){ 
    def cifUserService = new CorporateUserService() 
    mockDomain(UserRole,[]) 
    def newuserRole2=UserRole.create(user,role2) 
    def newuserRole=UserRole.create(user,role) 
    newuserRole.executeUpdate 'DELETE FROM UserRole WHERE user= :user',[user: user] 
    try{ 
     cifUserInstance = cifUserService.delete(cifUser) 
    } 
    catch(RuntimeException e){ 
     println e 
    } 
} 

我有這樣的錯誤:

「groovy.lang.MissingMethodException: com.logika.corp.security.UserRole.executeUpdate() 適用於參數類型: 沒有方法的簽名 ( java.lang.String中, java.util.LinkedHashMap中)的值: [DELETE FROM的UserRole WHERE用戶= :用戶,[用戶:用戶1]]」

任何人都可以知道如何解決此誤差Δθ

回答

0

嘗試:

newuserRole.executeUpdate 'DELETE FROM UserRole WHERE user= :user',user 

看到here

我希望它能幫助!

1

這裏的問題是Grails在運行時增加了很多動態方法。 mockDomain()方法添加動態findBy ...方法等,但不添加executeUpdate動態方法。

所以,你有兩個選擇

1 /將單元測試到集成測試文件夾。這樣,grails創建一個完整的運行時環境,並添加所有的動態類。 (在較慢的運行時間爲代價)

2 /模擬出的executeUpdate讓你只是測試自己的代碼的行爲。 (您不一定要單元測試grails代碼?)

registerMetaClass(UserRole) 
UserRole.metaClass.static.executeUpdate={String query, Map items-> println "Mocking executeUpdate"}