5

いくつかのユニット/統合テストでスプリング セキュリティをモックする方法を探しています。

  • グレイル: V2.1.0
  • Spring セキュリティ コア: V1.2.7.3

コントローラには次のものがあります。

// some action
def index(){
   def user = getLoggedInUser()
   render ....
}
...

private getLoggedInUser(){
    return User.get(springSecurityService.principal.id)
}

次の方法やその他のさまざまな方法を試しましたが、機能することがわかりません。

void testSomething(){
    def dc = new SomeController()
    dc.springSecurityService = [
            encodePassword: 'password',
            reauthenticate: { String u -> true},
            loggedIn: true,
            principal: [username:"Bob"]]
    dc.index() 
    ... assertion....

ユーザーが作成されておらず、principal.id. 何か提案やより良い代替案はありますか?

4

1 に答える 1

5

ユーザーは作成されているだけで保存されていないと思います。そのため、ID がありません。

解決策は次のとおりです。

void testSomething(){
    def dc = new SomeController()
    def loggedInUser = new User(username: "Bob").save() // This way the user will have an ID
    dc.springSecurityService = [
        encodePassword: 'password',
        reauthenticate: { String u -> true},
        loggedIn: true,
        principal: loggedInUser]
    dc.index() ... assertion....

別の方法があります:

void testSomething(){
    def dc = new SomeController()
    def loggedInUser = new User(...).save()
    dc.metaClass.getLoggedInUser = { loggedInUser }
...

getLoggedInUser へのリファクタリングをお勧めします。

private getLoggedInUser(){
    return springSecurityService.currentUser
}

この変更により、次のように記述できます。

void testSomething(){
    def dc = new SomeController()
    def loggedInUser = new User(...).save()
    dc.springSecurityService = [
        encodePassword: 'password',
        reauthenticate: { String u -> true},
        loggedIn: true,
        getCurrenUser: { loggedInUser }]
...
于 2012-08-12T23:46:11.843 に答える