0

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

这是域类

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]]“

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

4

2 回答 2

1

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

所以你有几个选择

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

或者

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

registerMetaClass(UserRole )
UserRole.metaClass.static.executeUpdate={String query, Map items-> println "Mocking executeUpdate"}
于 2012-03-14T10:30:09.490 回答
0

尝试:

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

在这里看到

我希望它有帮助!

于 2011-12-05T08:01:09.487 回答