2011-06-09 97 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"}