Такое поведение странно только на первый взгляд. Основной причиной является стратегия разрешения DELEGATE_FIRST
в сочетании с тем, что в этом случае делегат является экземпляром Expando. DELEGATE_FIRST
сначала ищет свойство EMAIL_SUBJECT
в делегате, то есть mockMailService
, то есть Expando. Expando не выдает groovy.lang.MissingPropertyException
пропущенных свойств, вместо этого он возвращает ноль. Таким образом, свойство находится у делегата и не оценивается владельцем (это будет Something
, от которого вы хотите получить свойство).
Вы можете изменить стратегию разрешения на OWNER_FIRST
. Если вы хотите придерживаться DELEGATE_FIRST
, потому что исходная mailService
вызывает параметр закрытия sendMail
с этой стратегией, вы не можете использовать Expando для службы по умолчанию. Вместо этого вы можете использовать обычный объект и выполнять метапрограммирование в метаклассе.
Это будет выглядеть примерно так:
def createMockMailService() {
def mockMailService = new Object()
mockMailService.metaClass.sendMail = { callable ->
callable.delegate = mockMailService
callable.resolveStrategy = Closure.DELEGATE_FIRST
callable.call()
}
mockMailService.metaClass.subject = { header -> }
mockMailService
}