1

Spring SecurityCorePluginによって生成されたユーザードメインのコントローラーを単体テストしようとしています。コントローラは、grailsgenerate-allを使用して生成されました。ドメインには、springSecurityServiceと呼ばれる一時的なプロパティがあります。私の単体テストでは、そのサービスをモックし、この一時変数をモックバージョンに割り当てようとしています。ただし、このエラーが発生します:

No such property: springSecurityService for class: com.myapp.security.SecUser Possible solutions:
springSecurityService groovy.lang.MissingPropertyException: No such property: springSecurityService for class: 
com.myapp.security.SecUser at com.myapp.security.SecUserControllerTests.setUp(SecUserControllerTests.groovy:26)

これが私のドメインのようです:

class SecUser {
    transient springSecurityService
    String username
    String password
    boolean enabled
    boolean accountExpired
    ....
    def beforeInsert() {
        encodePassword()
    }
    protected void encodePassword() {
        password = springSecurityService.encodePassword(password)
    }
}

これが私のテストの様子です:

 package com.myapp.security

 import org.junit.*
 import grails.test.mixin.*
 import com.myapp.system.*
 import grails.plugins.springsecurity.*

 @TestFor(SecUserController)
 @Mock([SecUser,SpringSecurityService])
 class SecUserControllerTests {

    @Before void setUp() { 
       def service = mockFor(SpringSecurityService)
       service.demand.encodePassword(1..2) { a -> return 'd3jk3j4ls234'}
       def control = service.createMock()
       SecUser.springSecurityService = control
   }

何が間違っているのかわからない、または一時的なプロパティでこのようなことを行うことさえできますか?

4

2 に答える 2

2

モックアップの状況である可能性があります。これが機能するかどうかを確認してください。

@Before void setUp() { 
    def service = mockFor(SpringSecurityService)
    // using the groovy MetaClass runtime
    service.metaclass.encodePassword = {def a -> 'd3jk3j4ls234'}
    SecUser.springSecurityService = service
}

またはより静的なソリ​​ューション:

@Before void setUp() { 
    secUser.springSecurityService = [
        encodePassword : {def a -> 'd3jk3j4ls234'}
    ] as SpringSecurityService
}
于 2012-09-05T07:40:07.363 に答える
1

springSecurityServiceモックをSecUser クラスに割り当てようとしています(静的であるかのように)。これは、インスタンス変数の場合は機能しません。私は新しいGrails2テストアノテーションの専門家ではありませんが、置き換えれば

SecUser.springSecurityService = control

SecUser.metaClass.getSpringSecurityService = {-> control}

その後、それはあなたが望むことをするはずです。

于 2012-09-05T08:20:27.903 に答える