SPOCK - Все переменные @Shared имеют значение NULL

Вот мой тестовый класс:

import grails.test.mixin.*
import spock.lang.Specification
import spock.lang.Unroll
import spock.lang.*
import groovy.util.logging.Slf4j

@Slf4j
@Mock([PromoRule, PromoCode, SecUser])
@TestFor(PromoService)
class PromoServiceSpec extends Specification {

@Shared testUser
@Shared testCode
@Shared testRule

def setup() {

}

@Unroll
def 'valid promo codes - #user, #code'() {
    given:
    testRule = new PromoRule(
            name : "ZTEST",
            receiverAmount : 5,
            receiverAmountType : PromoRule.AmountType.DOLLARS,
            senderAmount : 0,
            senderAmountType : PromoRule.AmountType.DOLLARS,
            receiverPointsAmount : null,
            receiverPointsAmountType : null,
            receiverMaxUse : null,
    )
    testRule.save(flush:true, failOnError:true)

    testUser = new SecUser(
            id: 1,
            version: 0,
            accountExpired: false,
            accountLocked: false,
            age: 9000,
            balance: 100,
            dateCreated: new Date(),
            emailVerified: true,
            enabled: true,
            firstName: 'Sir',
            lastName: 'Buttocks',
            lastUpdated: new Date(),
            lockedBalance: 0,
            username: "1",
            staff: false,
            displayName: 'sir_buttocks',
            usernameChosen: true,
            depositMade: true,
            depositOfferRecentlySeen: false,
            pin: null
    )
    testUser.save(flush: true, failOnError: true)

    testCode = new PromoCode(
            rule : testRule,
            code : "3",
            senderId : 1,
    )
    testCode.save(flush:true, failOnError:true)

    expect:
    service.isValidPromoCode(user, code) == value

    where:
    user | code || value
    testUser | testCode || true
}

}

Когда я запускаю этот тест, я получаю следующее:

| Failure:  valid promo codes - null, null(skillz.PromoServiceSpec)
|  Condition not satisfied:

service.isValidPromoCode(user, code) == value
|       |                |     |     |  |
|       false            null  null  |  true
skillz.PromoService@20e0e9d5         false

Я пробовал массу различных конфигураций и макетов, и все они либо приводили меня к исключению нулевого указателя (на саму переменную), либо к нулевому значению для переменной.

Выполнение всех определений переменных static также ничего не изменило, результат тот же, что и при использовании @Shared.

Я тоже пробовал издеваться над ними, но всегда получаю нулевые исключения при попытке выполнить .Mock() для класса...

Спасибо!!


person ChronaldMcDonald    schedule 15.01.2014    source источник
comment
Вы также пробовали @Shared def testUser? Использование def.   -  person dmahapatro    schedule 16.01.2014
comment
Да, не люблю это делать.   -  person ChronaldMcDonald    schedule 17.01.2014


Ответы (1)


Я не совсем уверен, чего вы пытаетесь достичь здесь, но блок where оценивается до (остальной части) метода, и в это время ваши общие переменные равны нулю. Вам нужно будет установить их раньше, например. в методе setupSpec (не setup).

person Peter Niederwieser    schedule 16.01.2014