如何使用Groovy在SoapUI中计算一个类似于classname.methodname的字符串?

时间:2019-05-23 15:56:42

标签: groovy

我的代码如下:

def randomInt = RandomUtil.getRandomInt(1,200);
log.info randomInt

def chars = (("1".."9") + ("A".."Z") + ("a".."z")).join()
def randomString = RandomUtil.getRandomString(chars, randomInt)   //works well with this code
log.info  randomString


evaluate("log.info new Date()")

evaluate('RandomUtil.getRandomString(chars, randomInt)')   //got error with this code

我想使用Groovy在SoapUI中评估一个像{classname}。{methodname}的字符串,就像上面一样,但是这里出现错误,如何处理并使其按我期望的那样正常工作?

我尝试过自爆:

evaluate('RandomUtil.getRandomString(chars, randomInt)')   //got error with this code

错误如下:

  

CST 2019年5月23日22:26:30:错误:发生错误[没有这样的属性:类com.hypers.test.apitest.util.RandomUtil的getRandomString(chars,randomInt)],请参见错误日志详细信息

1 个答案:

答案 0 :(得分:0)

以下代码:

log = [info: { println(it) }]

class RandomUtil { 
  static def random = new Random()

  static int getRandomInt(int from, int to) {
    from + random.nextInt(to - from)
  }

  static String getRandomString(alphabet, len) {
      def s = alphabet.size()
      (1..len).collect { alphabet[random.nextInt(s)] }.join()
  }
}

randomInt = RandomUtil.getRandomInt(1, 200)
log.info randomInt

chars = ('a'..'z') + ('A'..'Z') + ('0'..'9')

def randomString = RandomUtil.getRandomString(chars, 10)   //works well with this code
log.info  randomString


evaluate("log.info new Date()")

evaluate('RandomUtil.getRandomString(chars, randomInt)')   //got error with this code

模拟您的代码,可以运行,并在运行时产生以下输出:

~> groovy solution.groovy
70
DDSQi27PYG
Thu May 23 20:51:58 CEST 2019

~> 

我组成了RandomUtil类,因为您没有包含它的代码。

我认为您看到错误的原因是您使用以下命令定义了变量charrandomInt

def chars = ... 

def randomInt = ...

这会将变量放入本地脚本范围。请参阅this stackoverflow answer以获得说明,并提供指向将各种内容放入脚本全局范围的不同方法的文档的链接,以及有关其工作方式的说明。

基本上,您的常规脚本代码隐式是groovy Script class的实例,而该实例又与之相关联的隐式Binding instance。编写def x = ...时,变量是局部范围的,编写x = ...binding.x = ...时,变量是在脚本绑定中定义的。

evaluate方法使用与隐式脚本对象相同的绑定。因此,我上面的示例起作用的原因是,我省略了def并只键入了chars =randomInt =,这将变量放入脚本绑定中,从而使它们可用于{{ 1}}表达式。

尽管我不得不说,尽管如此,措词evaluate对我来说真的很奇怪...我本来希望No such property: getRandomString(chars, randomInt)No such method等。

共享No such property: chars的代码可能会有所帮助。