我试图找出在Spock单元测试中是否有可能禁用事件侦听器。
我正在Grails应用程序中开发一个服务,在保存一个新对象(一个组织)时使用事件侦听器。在这里使用发布服务器和订阅服务器,我可以创建一个新的RecipientGroup,并使其成为组织的默认组,其顺序似乎更适合Hibernate。
下面是保存方法和保存方法中事件的订阅服务器:
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 ()的单元测试。我更愿意将创建对象和这些额外任务分成不同的单元测试。因此,我试图找出在我的测试中是否有一种方法可以禁用发布者或侦听器。对于如何构造这个结构,也开放给其他的想法。
下面是一个测试:
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 * _
}提前感谢!
发布于 2022-08-22 16:02:24
重新审视这个问题,因为我现在有了一个可行的解决办法。单元测试似乎只获取要测试的类中的发行者/订阅者批注。将订阅服务器移动到不同的服务允许禁用事件侦听器进行测试,因此我可以为这两种方法构建单独的单元测试:
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
}
}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)
}
}https://stackoverflow.com/questions/70671067
复制相似问题