繁体   English   中英

具有Spock模拟功能的Grails单元测试服务

[英]Grails unit testing service with spock mocking functionality

目前正在尝试测试Grails 服务具有Geb功能测试的经验

尝试模拟服务将需要的必要的必要数据 (例如User等)...不管我似乎如何声明/初始化感兴趣的域,它们在我所有的测试方法中都显示为NULL

我试图一次设置此必需的信息,以便可以通过测试方法重用它。

@TestFor(ReminderService)
@Mock([Reminder, User, Subscriptions, Organisation, UserOrganisation, OrganisationRole, Ref, Role, Title])
class ReminderServiceTests extends Specification {

@Shared user, org, userOrg, roleUser, sub, orgRole, ti, refVals, reminder
def mailService


def setup() {
    def refSubStatus  = new Ref(value: 'Current').save()
    def refSubPublic  = new Ref(value: 'No').save()
    def refSubType    = new Ref(value: 'Subscription Taken').save()
    def refRemUnit    = new Ref(value: 'Month').save()
    def refOrgRole    = new Ref(value: 'Subscriber').save()
    def refRemMethod  = new Ref(value: 'email').save()
    def refRemTrigger = new Ref(value: 'Subscription Manual Renewal Date').save()
    reminder          = new Reminder(user: user,  active: true, amount: 1, unit:refRemUnit, reminderMethod:refRemMethod, trigger: refRemTrigger, lastRan:null).save()
    refVals     = [refSubStatus,refSubPublic, refSubType, refRemUnit, refOrgRole, refRemMethod, refRemTrigger]
    roleUser          = new Role(authority: 'BASIC_USER', roleType:'global').save()

    ti                = new Title(title: "A random title....", impId: UUID.randomUUID().toString()).save()
    sub               = new Subscription(name:"A random subscription name",
                                         status:refSubStatus,
                                         identifier:UUID.randomUUID().toString(),
                                         impId:UUID.randomUUID().toString(),
                                         startDate:new LocalDate().minusYears(1).toDate(),
                                         endDate: new LocalDate().plusMonths(1).toDate(),
                                         isPublic: refSubPublic,
                                         type: refSubType,
                                         renewal: new LocalDate().minusMonths(3).toDate()).save()
    org               = new Organisation(name: "new org", impId: UUID.randomUUID().toString()).save()
    orgRole           = new OrganisationRole(sub: sub, roleType: refOrgRole, org: org).save()
    user              = new User(username: 'j_doe', firstname: "John", lastname: "Doe", email: 'example@googlemail.com', defaultDash: org).save()
    userOrg           = new UserOrganisation(org: org, user: user, formalRole: roleUser, status: 1).save()
    mailService       = new MailService()
//        mockDomain(Ref, refdataValues)
//        mockDomain(Title, ti)
//        mockDomain(OrganisationRole, orgRole)
//        mockDomain(Organisation, org)
//        mockDomain(User, user)
//        mockDomain(UserOrganisation, userOrg)
//        mockDomain(Reminder, reminder)
}


def "Getting subscriptions for a user"() {
    when:
    def subscriptions = service.getAuthorisedSubsciptionsByUser(user)

    then:
    subscriptions != null
    subscriptions.size() > 0
}

一切都为空,我已经尝试过使用模拟域(请参阅setup()注释掉的部分,包括使用setupSpec()不太正确)

您是否尝试过不使用@Shared? 正如我现在所看到的,您不需要它。 您的引用在规范的整个生命周期中都是共享的,但您需要将初始化代码放入安装程序中,该代码在每个规范之前被调用。 这似乎是不对的。 @shared变量内部存储在与普通变量不同的实例中,因此可能存在某种混淆。 另外,您可以尝试对@Shared变量使用setupSpec()而不是setup()。

@TestFor(SomeService)
@Mock([DomainClass])
class SomeServiceSpec extends Specification {
    def "test someMethod"() {
        given:
            def x = new DomainClass(attr1: 'a', attr2: 'b').save(flush: true)
        when:
            def result = service.someMethod() // returns that saved Domain instance
        then:
            result instanceof DomainClass
            result.attr1 == 'a'
            result.attr2 == 'b'
    }
}

.save()在我的单元测试中被证明是不够的,而.save(flush:true)会产生所需的结果。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM