实现过程很简单,以下说下步骤:
1.编写runTest()方法,需要传入测试类全名。
2.编写注解,这里需要注意,一定要制定生命周期为runtime。否则用反射查找(运行时)会找不到注解。
3.实现runTest()方法,反射动态加载类,动态创建对象,动态执行标记注解的方法。(如果要执行私有方法需要赋予权限)
示意图:
代码实现如下:
public class JUnitPrototype { /** * 给定类的全名,执行该类中@Test注解标记的无参方法(含私有方法) * @param className * @throws Exception */ public static void runTest(String className)throws Exception{ Class clazz = Class.forName(className); for(Method m : clazz.getDeclaredMethods()){ //如果方法上有@Test注解,则执行该方法 if(m.getAnnotation(Test.class)!=null){ m.setAccessible(true);//打开私有方法执行权 m.invoke(clazz.newInstance()); //执行方法 } } } }
注解:
@Retention(RetentionPolicy.RUNTIME)//指定注解的生命周期:运行期 public @interface Test { }
测试代码:
public class TestClass { public static void sayHello(){ System.out.println("hello!"); } @Test private void sayHi(){ System.out.println("hi!"); } @Test public static void sayGoobdy(){ System.out.println("goodby!"); } public static void main(String[] args) throws Exception { JUnitPrototype.runTest("com.yuer.TestClass"); } }
注意的问题:getMethods 与 getDeclaredMethods 的区别
public Method[] getMethods()返回某个类的所有公用(public)方法包括其继承类的公用方法,当然也包括它所实现接口的方法。
public Method[] getDeclaredMethods()对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法。当然也包括它所实现接口的方法。