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 user= :user, [user:user1]]"

誰でもこのエラーを修正する方法を知っていますか??

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 に答える