как обнаружить экземпляр вызывающего абонента в Groovy скрипте SoapUI - PullRequest
2 голосов
/ 30 ноября 2011

Проект 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 ()?

1 Ответ

1 голос
/ 30 ноября 2011

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


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

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

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

class Example {
  String name
}

Затем мы можем написать класс, очень похожий на ваш пример кода, который в этом случае установит делегат замыкания, а замыкание выведет свойство 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
...