JMeter使用jsonassert对比JSON失败,提示找不到CustomComparator构造方法
问题:JMeter中使用jsonassert工具报错找不到构造方法
环境信息
- JMeter版本:5.5
- jsonassert版本:1.5.1
- 已放置Jar包:
jsonassert-1.5.1.jar、android-json-0.0.20131108.vaadin1.jar(路径:%JMeter%/lib及%JMeter%/lib/ext) - Jackson版本:2.13.3
- 运行情况:IDEA+JDK8环境下代码正常执行,JMeter的Beanshell Sampler执行报错
错误信息
Response code:500 Response message:org.apache.jorphan.util.JMeterException: Error invoking bsh method: eval Sourced file: inline evaluation of: ``import org.skyscreamer.jsonassert.Customization; import org.skyscreamer.jsonasse . . . '' : Constructor error: Can't find constructor: org.skyscreamer.jsonassert.comparator.CustomComparator( org.skyscreamer.jsonassert.JSONCompareMode, org.skyscreamer.jsonassert.Customization ) in class: org.skyscreamer.jsonassert.comparator.CustomComparator
JMeter Beanshell Sampler代码
import org.skyscreamer.jsonassert.Customization; import org.skyscreamer.jsonassert.JSONCompare; import org.skyscreamer.jsonassert.JSONCompareMode; import org.skyscreamer.jsonassert.JSONCompareResult; import org.skyscreamer.jsonassert.ValueMatcher; import org.skyscreamer.jsonassert.comparator.CustomComparator; import org.json.JSONException; String newResponseMessage = vars.get("new_S{custNo}"); String oldResponseMessage = vars.get("old_S{custNo}"); log.info("oldRes"+oldResponseMessage); log.info("newRes"+newResponseMessage); ValueMatcher matcher = new ValueMatcher() { public boolean equal(Object o1, Object o2) { return true; } }; Customization customization = new Customization("orgSeqNo", matcher); JSONCompareResult result; try { result = JSONCompare.compareJSON(newResponseMessage, oldResponseMessage, new CustomComparator(JSONCompareMode.NON_EXTENSIBLE,customization)); if (result.passed()) { System.out.println("no different"); } else { System.out.println(result.getMessage()); log.error(result.getMessage()); // ctx.getEngine().stopTest(); } }catch (JSONException e){ log.error("Beanshell failure: ", e); throw ex; }
IDEA中可正常运行的配置与代码
Maven依赖
<dependency> <groupId>org.skyscreamer</groupId> <artifactId>jsonassert</artifactId> <version>1.5.1</version> </dependency>
Java代码
public class Main { static String jsonStr1 = "{\"orgSeqNo\":\"123123\",\"code\":200,\"person\":{\"partyId\":\"10000000001\",\"partyName\":\"john\",\"partyCertType\":\"10100\",\"partyCertNo\":\"320925199612122314\",\"partyStatus\":\"1\",\"addresses\":[{\"addrId\":\"1\",\"partyId\":\"10000000001\",\"city\":\"suchou\",\"detailAddr\":\"asdfghqwe\",\"addrType\":103,\"phone\":\"13213137625\"},{\"addrId\":\"2\",\"partyId\":\"10000000001\",\"city\":\"suchou\",\"detailAddr\":\"asdfghqwe\",\"addrType\":\"101\",\"phone\":\"13213137625\"},{\"addrId\":\"3\",\"partyId\":\"10000000001\",\"city\":\"suchou\",\"detailAddr\":\"asdfghqwe\",\"addrType\":\"102\",\"phone\":\"13213137625\"}]},\"message\":\"ok\"}"; static String jsonStr2 = "{\"orgSeqNo\":\"12e9fc45c09b4a69b7aa2bbcb1313cba\",\"code\":200,\"person\":{\"partyId\":\"10000000001\",\"partyName\":\"john\",\"partyCertType\":\"10100\",\"partyCertNo\":\"320925199612122314\",\"partyStatus\":\"1\",\"addresses\":[{\"addrId\":\"1\",\"partyId\":\"10000000001\",\"city\":\"suchou\",\"detailAddr\":\"asdfghqwe\",\"addrType\":\"103\",\"phone\":\"13213137625\"},{\"addrId\":\"2\",\"partyId\":\"10000000001\",\"city\":\"suchou\",\"detailAddr\":\"asdfghqwe\",\"addrType\":\"101\",\"phone\":\"13213137625\"},{\"addrId\":\"3\",\"partyId\":\"10000000001\",\"city\":\"suchou\",\"detailAddr\":\"asdfghqwe\",\"addrType\":\"102\",\"phone\":\"13213137625\"}]},\"message\":\"ok\"}"; static String jsonStr3 = "{\"orgSeqNo\":\"12e9fc45c09b4a69b7aa2bbcb1313cba\",\"code\":200,\"person\":{\"partyId\":\"10000000001\",\"partyName\":\"john\",\"partyCertType\":\"10100\",\"partyCertNo\":\"320925199612122314\",\"partyStatus\":\"1\",\"addresses\":[{\"addrId\":\"2\",\"partyId\":\"10000000001\",\"city\":\"suchou\",\"detailAddr\":\"asdfghqwe\",\"addrType\":\"101\",\"phone\":\"13213137625\"},{\"addrId\":\"1\",\"partyId\":\"10000000001\",\"city\":\"suchou\",\"detailAddr\":\"asdfghqwe\",\"addrType\":\"103\",\"phone\":\"13213137625\"},{\"addrId\":\"3\",\"partyId\":\"10000000001\",\"city\":\"suchou\",\"detailAddr\":\"asdfghqwe\",\"addrType\":\"102\",\"phone\":\"13213137625\"}]},\"message\":\"ok\"}"; static String jsonStr4 = "{\"orgSeqNo\":\"12e9fc45c09b4a69b7aa2bbcb1313cba\",\"code\":200,\"person\":{\"partyId\":\"10000000001\",\"partyName\":\"john\",\"partyCertType\":\"10100\",\"partyCertNo\":\"320925199612122314\",\"partyStatus\":\"1\",\"addresses\":[{\"addrId\":\"1\",\"partyId\":\"10000000001\",\"city\":\"suchou\",\"detailAddr\":\"asdfghqwe\",\"addrType\":103,\"phone\":\"13213137625\"},{\"addrId\":\"2\",\"partyId\":\"10000000001\",\"city\":\"suchou\",\"detailAddr\":\"asdfghqwe\",\"addrType\":\"101\",\"phone\":\"13213137625\"},{\"addrId\":\"3\",\"partyId\":\"10000000001\",\"city\":\"suchou\",\"detailAddr\":\"asdfghqwe\",\"addrType\":\"102\",\"phone\":\"13213137625\"}]},\"message\":\"ok\"}"; public static void main(String[] args) { ValueMatcher matcher = new ValueMatcher() { @Override public boolean equal(Object o1, Object o2) { return true; } }; Customization customization = new Customization("orgSeqNo", matcher); JSONCompareResult result = null; try { result = JSONCompare.compareJSON(jsonStr1, jsonStr3, new CustomComparator(JSONCompareMode.NON_EXTENSIBLE,customization)); if (result.passed()) { System.out.println("no different"); } else { System.out.println(result.getMessage()); } } catch (JSONException e) { e.printStackTrace(); throw new RuntimeException(e); } } }
期望结果
person.addresses[addrId=1].addrType Expected: 103 got: 103
解决办法
- 替换为JSR223 Sampler:Beanshell对Java语法兼容有限,改用Groovy引擎的JSR223 Sampler,直接复用现有代码即可正常执行,Groovy对Java语法支持更完善。
- 移除冲突Jar包:删除
%JMeter%/lib和%JMeter%/lib/ext中的android-json-0.0.20131108.vaadin1.jar,JMeter自带的json库可与jsonassert兼容,避免类加载冲突。 - 调整Beanshell构造方法调用:若坚持使用Beanshell,将CustomComparator的构造参数改为数组形式(Beanshell无法识别可变参数),修改代码如下:
result = JSONCompare.compareJSON(newResponseMessage, oldResponseMessage, new CustomComparator(JSONCompareMode.NON_EXTENSIBLE, new Customization[]{customization})); - 重启JMeter:修改Jar包或Sampler类型后,必须重启JMeter确保类加载生效。
内容的提问来源于stack exchange,提问作者gangye
相关产品推荐
相关产品推荐

