最近我在尝试实现分布式性能测试功能的拓展,其中的一个思路就是通过反射执行jar
包中写好的测试方法达到自动执行性能测试用例的目的。但是在进行技术验证的时候,遇到了一个坑,就是在使用com.funtester.frame.execute.ExecuteSource#executeMethod(java.lang.String, java.lang.Object...)
方法运行用例的时候,总是会报错:
INFO-> 当前用户:oker,工作目录:/Users/oker/IdeaProjects/funtester/,系统编码格式:UTF-8,系统Mac OS X版本:10.16
WARN-> 方法属性处理错误!
java.lang.NoSuchMethodException: com.funtest.javatest.FunTester.test()
at java.lang.Class.getMethod(Class.java:1786) ~[?:1.8.0_281]
at com.funtester.frame.execute.ExecuteSource.executeMethod(ExecuteSource.java:115) [classes/:?]
at com.funtest.javatest.FunTester.main(FunTester.java:16) [classes/:?]
WARN-> 反射执行方法失败:com.funtest.javatest.FunTester.test
java.lang.IllegalAccessException: Class com.funtester.frame.execute.ExecuteSource can not access a member of class com.funtest.javatest.FunTester with modifiers "static"
at sun.reflect.Reflection.ensureMemberAccess(Reflection.java:102) ~[?:1.8.0_281]
at java.lang.reflect.AccessibleObject.slowCheckMemberAccess(AccessibleObject.java:296) ~[?:1.8.0_281]
at java.lang.reflect.AccessibleObject.checkAccess(AccessibleObject.java:288) ~[?:1.8.0_281]
at java.lang.reflect.Method.invoke(Method.java:491) ~[?:1.8.0_281]
at com.funtester.frame.execute.ExecuteSource.executeMethod(ExecuteSource.java:132) [classes/:?]
at com.funtest.javatest.FunTester.main(FunTester.java:16) [classes/:?]
Process finished with exit code 0
起初我忽略了第二个错误,因为第一个错误导致Method
对象创建失败导致的。
下面是我测试代码:
package com.funtest.javatest;
import com.funtester.frame.SourceCode;
import com.funtester.frame.execute.ExecuteSource;
import java.io.IOException;
public class FunTester extends SourceCode {
public static void main(String[] args) throws IOException {
ExecuteSource.executeMethod("com.funtest.javatest.FunTester.test");
}
static void test() {
output("FunTester成功了!");
}
}
在经过大量查询资料和修改代码进行测试的过程后,我都要放弃了。又重新翻阅了代码提交记录,对于了文章命令行如何执行 jar 包里面的方法时的代码,依然没有发现问题。
我重新看了一下第二个错误java.lang.IllegalAccessException: Class com.funtester.frame.execute.ExecuteSource can not access a member of class com.funtest.javatest.FunTester with modifiers "static"
,这个信息让我想起来Groovy
的特性,就是省略关键字public
的功能,这样一来,方法的第一个关键字变成了static
。
顿觉茅塞顿开!!!
修改代码如下:
public static void test() {
output("FunTester成功了!");
}
控制台输出如下:
INFO-> 当前用户:oker,工作目录:/Users/oker/IdeaProjects/funtester/,系统编码格式:UTF-8,系统Mac OS X版本:10.16
INFO-> FunTester成功了!
Process finished with exit code 0
终于淌过了一条小溪流。再等等我完善一下测试框架的分布式执行性能测试脚本的拓展,再来分享!