4

私は新しい Grails プロジェクトに取り組んでおり、最近、Spring Security Core で生成された User クラスのデフォルト規則が beforeInsert/Update イベントを介してパスワードを自動エンコードすることに気付きました。これは、エンコードを行うための優れたクリーンな DRY 方法であり、そうすることを忘れることもありません。

ただし、上記の User クラスを使用するいくつかの単体テストを作成しようとすると、(エンコードのために) springSecurityService をモック アウトするか、より好ましくは (そしてきれいに) オーバーライドする必要があることがわかります。何もしない beforeInsert/Update クロージャー。通常、Groovy では、ExpandoMetaClass を使用してメソッドをオーバーライドできます。

User.metaClass.beforeInsert = { /* do nothing */ }  

...しかし、新しいユーザーを作成して保存すると、元の beforeInsert が引き続き呼び出されることがわかりました。これにより、単体テストが爆発します。これを回避してサービスをモックアウトするのは簡単ですが、上記は機能するはずです。何か不足していますか?私が取り上げていないGORMのイベント閉鎖と何か違うことはありますか?

4

3 に答える 3

1

クロージャーは実際には toString() や save()のbeforeInsertようなメソッドであるだけでなく、Gormでサポートされている定義済みのイベントでもあります。メソッドをオーバーライドしても、Gorm が PreInsert イベントを発生させることは妨げられず、元のプロセスにつながります。

于 2012-12-29T10:20:24.683 に答える