首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Spock单元测试中禁用事件侦听器

在Spock单元测试中禁用事件侦听器
EN

Stack Overflow用户
提问于 2022-01-11 17:34:46
回答 1查看 112关注 0票数 1

我试图找出在Spock单元测试中是否有可能禁用事件侦听器。

我正在Grails应用程序中开发一个服务,在保存一个新对象(一个组织)时使用事件侦听器。在这里使用发布服务器和订阅服务器,我可以创建一个新的RecipientGroup,并使其成为组织的默认组,其顺序似乎更适合Hibernate。

下面是保存方法和保存方法中事件的订阅服务器:

代码语言:javascript
复制
class MyService {

    @Transactional
    @Publisher(Event.ORGANIZATION_CREATED)
    Organization save(Organization organization) {
    
        if (Organization.findByName(organization.name))
            throw new Exception('organization.create.exists')
    
        organization.save(failOnError: true)
        sendSignupNotification(organization)
        metricsService.createDefaults(organization)
    
        return organization
    }

    @Transactional
    @Subscriber(Event.ORGANIZATION_CREATED)
    void createDefaultRecipientGroup(Organization org) {
        Organization organization = organizationDataService.get(org.id)
        organization.defaultGroup = new RecipientGroup(organization: organization).save(failOnError: true, flush: true)
        organization.save(flush: true)
    }
}

但是,这破坏了我的一些单元测试,即在我的订阅者方法中引用cannot invoke method get() on a null object ()的单元测试。我更愿意将创建对象和这些额外任务分成不同的单元测试。因此,我试图找出在我的测试中是否有一种方法可以禁用发布者或侦听器。对于如何构造这个结构,也开放给其他的想法。

下面是一个测试:

代码语言:javascript
复制
void "test that the organization save method correctly sets up default Recipient group"() {
    setup:
    String foo = "foo"

    when:
    Organization organization = new Organization(name: foo)
    service.save(organization)

    and: "the default recipient group is created"
    RecipientGroup.findByOrganization(organization)

    and:
    1 * mockTextService.send(_, true)

    and:
    0 * _
}

提前感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-08-22 16:02:24

重新审视这个问题,因为我现在有了一个可行的解决办法。单元测试似乎只获取要测试的类中的发行者/订阅者批注。将订阅服务器移动到不同的服务允许禁用事件侦听器进行测试,因此我可以为这两种方法构建单独的单元测试:

代码语言:javascript
复制
class MyService1 {

    @Transactional
    @Publisher(Event.ORGANIZATION_CREATED)
    Organization save(Organization organization) {
    
        if (Organization.findByName(organization.name)) throw new Exception('organization.create.exists')
    
        organization.save(failOnError: true)
        sendSignupNotification(organization)
        metricsService.createDefaults(organization)
    
        return organization
    }
}
代码语言:javascript
复制
class MyService2 {

    @Transactional
    @Subscriber(Event.ORGANIZATION_CREATED)
    void createDefaultRecipientGroup(Organization org) {
        Organization organization = organizationDataService.get(org.id)
        organization.defaultGroup = new RecipientGroup(organization: organization).save(failOnError: true, flush: true)

        organization.save(flush: true)
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70671067

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档