繁体   English   中英

grails - 单元测试

[英]grails - unit testing

我很难对域中包含的方法进行单元测试,如下所示:

这是域 class

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.LinkedRHashMap) 值:[DELETE FROM UserRoleMap] WHERE 用户 =:用户,[用户:用户 1]]"

谁能知道如何解决这个错误??

这里的问题是Grails在运行时添加了很多动态方法。 mockDomain() 方法添加了动态 findBy... 方法等,但没有添加 executeUpdate 动态方法。

所以你有几个选择

1/ 将您的单元测试移动到集成测试文件夹。 这样 grails 将创建一个完整的运行时环境并将添加所有动态类。 (以较慢的运行时间为代价)

或者

2/ 模拟 executeUpdate 的行为,以便您只是测试自己的代码。 (您不一定要对 grails 代码进行单元测试?)例如

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

尝试:

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

这里看到

我希望它有帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM