как определить экземпляр вызывающего абонента в groovy-скрипте SoapUI?

Проект SoapUI может запускать случайный скрипт при загрузке. Сценарий загрузки вызывается с переменными журнала и проекта.
В моей общей библиотеке у меня есть метод addAsserts(), который проходит через весь проект и добавляет утверждения соответствия схеме к этапам тестирования SOAP. В моем сценарии загрузки я вызываю общий метод

addAsserts(this) 

передача «this» в качестве параметра и установка для него closure.delegate внутри метода addAsserts, чтобы сделать переменную «project» доступной в области закрытия

Метод addAsserts определен в sharedUtil.groovy:

static def addAsserts(that){
        def closure={
            project.testSuites.each { testSuiteName, testSuiteObject -> 
                testSuiteObject.testCases.each { testCaseName, testCaseObject ->
                    testCaseObject.testSteps.each { testStepName, testStepObject -> 
                        if ("class com.eviware.soapui.impl.wsdl.teststeps.WsdlTestRequestStep" == testStepObject.getClass().toString() ) {
                            log.info "adding 'Schema Compliance' assertion to ${testSuiteName}/${testCaseName}/${testStepName}"
                            testStepObject.addAssertion('Schema Compliance')
                        }
                    }
                }
            }
        }//closure

    closure.delegate=that  // <--- i would like NOT to pass 'that' as parameter
                           // but rather detect in runtime with some kind of
                           // getCallerInstance() method
    return closure.call()
}

ВОПРОС:

Можно ли обнаружить экземпляр вызывающего абонента во время выполнения с помощью какого-либо метода getCallerInstance()?


person ludenus    schedule 30.11.2011    source источник


Ответы (1)


Нет, я не верю, что это возможно. Не было и в Java (вы можете узнать имя/метод вызывающего класса, используя какой-то ужасный взлом трассировки стека, но не экземпляр самого класса)


Редактировать...

Это возможно с категорией (но у меня нет опыта работы с SoapUI, поэтому я не не знаю, подойдет ли эта техника)

Скажем, у нас есть класс Example, определенный следующим образом:

class Example {
  String name
}

Затем мы можем написать класс, очень похожий на код вашего примера, который в этом случае установит делегат замыкания, а замыкание выведет свойство имени делегата (поскольку мы установили разрешить стратегию на DELEGATE_ONLY)

class AssetAddingCategory {
  static def addAsserts( that ) {
    def closure = {
      "Name of object: $name"
    }
    
    closure.delegate = that
    closure.resolveStrategy = Closure.DELEGATE_ONLY
    closure.call()
  }
}

Позже в нашем коде можно сделать:

def tim = new Example( name:'tim' )

use( AssetAddingCategory ) {
  println tim.addAsserts()
}

И это распечатает

Name of object: tim
person tim_yates    schedule 30.11.2011