Jmeter beanshell不支持Map<String, String>泛型 解决方法(原创)

一、什么是Bean Shell

  • BeanShell是一种完全符合Java语法规范的脚本语言,并且又拥有自己的一些语法和方法;
  • BeanShell是一种松散类型的脚本语言(这点和JS类似);
  • BeanShell执行标准Java语句和表达式,另外包括一些脚本命令和语法。 
  beanshell官方文档 http://www.beanshell.org/manual/bshmanual.pdf
 

二、beanshell不支持泛型

什么是泛型
http://blog.csdn.net/s10461/article/details/53941091
 

泛型方法

你可以写一个泛型方法,该方法在调用时可以接收不同类型的参数。根据传递给泛型方法的参数类型,编译器适当地处理每一个方法调用。

下面是定义泛型方法的规则:

  • 所有泛型方法声明都有一个类型参数声明部分(由尖括号分隔),该类型参数声明部分在方法返回类型之前(在下面例子中的<E>)。
  • 每一个类型参数声明部分包含一个或多个类型参数,参数间用逗号隔开。一个泛型参数,也被称为一个类型变量,是用于指定一个泛型类型名称的标识符。
  • 类型参数能被用来声明返回值类型,并且能作为泛型方法得到的实际参数类型的占位符。
  • 泛型方法体的声明和其他方法一样。注意类型参数只能代表引用型类型,不能是原始类型(像int,double,char的等)。
 

三、解决方法 

1)改类型

 1 import com.xindun.server.util.Generator;
 2 import java.util.HashMap;
 3 import java.util.Map;
 4 import net.sf.json.JSONObject;
 5 
 6 Generator gen = new Generator();
 7 String version = "01";
 8 String randomUuid = "${__UUID}";
 9 String APP_ID = "com.example.demo";
10 String DEVICE_INFO = "{\"os_type\":\"android\", \"fpid\":\"12345678\", \"devid\":\"SALKJdFKJSALKFJLKSA2364723984\", \"version\":\"2\"}";
11 
12 StringBuffer result = new StringBuffer();
13         result.append(gen.GetMD5(APP_ID));
14         result.append(randomUuid);
15         result.append(version);
16 
17         Map params = new HashMap();
18 //        Map<String, Object> params = new HashMap<String, Object>();
19         params.put("app_id", APP_ID);
20         params.put("user_id", "zhangsan");
21         params.put("fpid", "");
22         params.put("phone", "15810047878");
23 //        vars.put("paa",parmas.get("app_id"));
24 //        SampleResult.setResponseData(vars.get("paa"));
25         System.out.println("aaa----------" + params);
26         String cookie = randomUuid + JSONObject.fromObject(params).toString() + ";;" + gen.getZipString(DEVICE_INFO);
27         String INIT_KEY = "OcUx0DhJrRTVUQJSL1mMbX4Ab78ROULkf052bcYbhImsa2jUZj7rl5wvS/9nZW/v"
28         byte[] rootkey_b = gen.decryptKeyForSave(INIT_KEY);
29         byte[] workkey = gen.getWorkKey(rootkey_b, randomUuid);

  如上代码第17非泛型写法,18行就是泛型。

  Map params = new HashMap();    //未指定类型。这种就不是泛型,可以用这个。

  Map<String, Object> params = new HashMap<String, Object>();             //用<>指定类型为泛型。这种在jmeter里报错。

2)把需要泛型部分的代码,打包成jar

  将jar放到lib/ext目录,然后在beanshell中调用对应的接口解决这个问题,beanshell 不支持java 1.5以上的语法 

3)直接将这个参数拼成字符串,当然我这个可以适用

{"app_id":\"" + APP_ID + "\",\"user_id":"zhangsan","fpid":"a444","phone":"15810047878"}

 
 

 

 

posted @ 2018-02-11 15:15  白灰  阅读(1508)  评论(0)    收藏  举报