Есть ли ошибка при использовании плагина Spock и Spring Security в одном проекте?

В своем текущем проекте я использую плагины Spring и Spock. Я написал кучу тестовых случаев в Spock. Все проходят без ошибок (Все ЗЕЛЕНЫЕ!). Но те же самые тесты терпят неудачу, если я пытаюсь протестировать приложение через некоторое время. Я не понимаю, почему это происходит. Это код (один из моих неудачных тестов):

def 'list action: 1 user'() { 

   setup: 
      mockDomain(User,[userInstance]) 

   expect: 
      controller.list() == [userInstanceList: [userInstance] , userInstanceTotal: 1] 
      params.max == 10 

   where: 
      userInstance = new User(username:"antoaravinth",password:"secrets") 
} 

Я получаю большую ошибку для этого:

java.lang.NullPointerException: Cannot invoke method encodePassword() on null object 
        at mnm.schedule.User.encodePassword(User.groovy:34) 
        at mnm.schedule.User.beforeInsert(User.groovy:42) 
        at org.grails.datastore.gorm.events.DomainEventListener.invokeEvent(DomainEventListener.java:188) 
        at org.grails.datastore.gorm.events.DomainEventListener.beforeInsert(DomainEventListener.java:110) 
        at org.grails.datastore.gorm.events.DomainEventListener.onPersistenceEvent(DomainEventListener.java:73) 
        at org.grails.datastore.mapping.engine.event.AbstractPersistenceEventListener.onApplicationEvent(AbstractPersistenceEventListener.java:46) 
        at org.grails.datastore.mapping.engine.EntityPersister.cancelInsert(EntityPersister.java:227) 
        at org.grails.datastore.mapping.engine.NativeEntryEntityPersister.executeInsert(NativeEntryEntityPersister.java:1321) 
        at org.grails.datastore.mapping.engine.NativeEntryEntityPersister$1.run(NativeEntryEntityPersister.java:698) 
        at org.grails.datastore.mapping.core.impl.PendingOperationExecution.executePendingOperation(PendingOperationExecution.java:33) 
        at org.grails.datastore.mapping.core.AbstractSession.flushPendingOperations(AbstractSession.java:322) 
        at org.grails.datastore.mapping.core.AbstractSession.flushPendingInserts(AbstractSession.java:314) 
        at org.grails.datastore.mapping.core.AbstractSession.flush(AbstractSession.java:237) 
        at org.grails.datastore.mapping.query.Query.flushBeforeQuery(Query.java:596) 
        at org.grails.datastore.mapping.query.Query.list(Query.java:562) 
        at org.grails.datastore.mapping.query.Query.singleResult(Query.java:606) 
        at org.grails.datastore.gorm.GormStaticApi.count_closure11(GormStaticApi.groovy:311) 
        at org.grails.datastore.mapping.core.DatastoreUtils.execute(DatastoreUtils.java:301) 
        at org.grails.datastore.gorm.AbstractDatastoreApi.execute(AbstractDatastoreApi.groovy:34) 
        at org.grails.datastore.gorm.GormStaticApi.count(GormStaticApi.groovy:307) 
        at mnm.schedule.UserController.list(UserController.groovy:241) 
        at mnm.schedule.UserControllerSpec.list action: 1 user(UserControllerSpec.groovy:34)

Класс домена:

package mnm.schedule
import org.example.*;
class User extends SecUser {
    Profile profile
    String username
    String password
    static constraints = {
    username(unique:true,size:3..15, blank:false)
    password(blank:false)
    String toString() {
        this.username
    }

    static mapping = {
        cache true
    }
    protected void encodePassword() {
    password = springSecurityService.encodePassword(password)
}

Set<SecRole> getAuthorities() {
    SecUserSecRole.findAllBySecUser(this).collect { it.secRole } as Set
}

def beforeInsert() {
    encodePassword()
}

def beforeUpdate() {
    if (isDirty('password')) {
        encodePassword()
    }
}

}

Один и тот же тест проходит время от времени и время от времени выдает эту ошибку. Что здесь не так? Как это может иногда проходить, а иногда терпеть неудачу?

Заранее спасибо.


person Ant's    schedule 23.03.2012    source источник
comment
Не уверен, почему это происходит. Но не могли бы вы скопировать код User.groovy? Похоже, что springSecurityService имеет значение null. Вы издеваетесь над этой службой?   -  person Ben W    schedule 23.03.2012
comment
@Saurabh: Нет, я не издеваюсь над этим сервисом! Как мне издеваться над этим?   -  person Ant's    schedule 23.03.2012
comment
@Saurabh: я обновил свой вопрос   -  person Ant's    schedule 23.03.2012


Ответы (1)


Проверьте этот блог как пример издевательства над springSecurityService в объектах домена.

http://www.block-consult.com/blog/2011/08/17/inject-spring-security-service-into-domain-class-for-controller-unit-testing/ или проверьте https://stackoverflow.com/a/9789619/206351

person Ben W    schedule 23.03.2012