註解優先於命名模式

bulingbuling^_^發表於2020-11-15

 test runner 工具以命令列方式接受一個完全限定的類名,並通過呼叫 Method.invoke 以反射方式執行類的所有帶測試註解的方法。isAnnotationPresent 方法告訴工具要執行哪些方法。如果測試方法丟擲異常,反射工具將其封裝在 InvocationTargetException 中。該工具捕獲這個異常並列印一個失敗報告,其中包含測試方法丟擲的原始異常,該異常是用 getCause 方法從 InvocationTargetException 提取的。

public class test39 {
    public static void main(String[] args) throws Exception {

        Sample.m3();
        int tests = 0;
        int passed = 0;
        Class<?> testClass = Class.forName(args[0]);
        for (Method m : testClass.getDeclaredMethods()) {
            if (m.isAnnotationPresent(faker.class)) {
                tests++;
                try {
                    m.invoke(null);
                    passed++;
                } catch (InvocationTargetException wrappedExc) {
                    Throwable exc = wrappedExc.getCause();
                    System.out.println(m + " failed: " + exc);
                } catch (Exception exc) {
                    System.out.println("Invalid @Test: " + m);
                }
            }
        }
        System.out.printf("Passed: %d, Failed: %d%n",passed, tests - passed);

    }
}

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@interface faker {

}

class Sample {
    @faker
    public static void m3() { // Test should fail
        throw new RuntimeException("error !!!!!");
    }

}

 

相關文章