2015年9月14日 星期一

custom annotation for method

先說,為了做 junit,是要做給別人看的~
所以文件要求的項目,格式都得要有~

但是......
因為工程師都很討厭寫文件...
因為工程師也很懶得寫註解...
因為懶得寫那些制式log...

所以就寫了一個 annotation ,來處裡~

很一般的annotation的作法~

import java.lang.annotation.*;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface JUnitTestAnnotation {
   
    String testName() default "";
    String testInput() default "";
    String testResult() default "";
    String testMemo() default "";
}

呼叫annotation的method
@JUnitTestAnnotation (
        testName="查詢-無條件查詢",
        testInput="無輸入",
        testMemo="查詢資料",
        testResult="數筆資料"
    )
    public void testQueryList1() {
        this.logStart();

然後~就可以開始掉 java.lang.reflact 的書包了~
在一開始 load 的時後,把全部的method annotation load進來
        Method[] ms = this.getClass().getMethods();
        for(int i = 0 ; i < ms.length ; i++)  {
            Method m = ms[i];
            if(m.isAnnotationPresent(JUnitTestAnnotation.class))  {
                JUnitTestAnnotation ano = m.getAnnotation(JUnitTestAnnotation.class);
                mpAno.put(m.getName(), ano);
            }
        }

然後在呼叫 logStart() 裡面,先取到「現在call 的method name」
StackTraceElement 是個很有趣的東西,把他的內容印出來。會有種熟析的fu...
原則上,第1個會是 「現在的method」,第2個就會是「前面 call 這個method 」的method...
(這真是個很妙的寫法~宅力又上升了XD)
        //StackTraceElement[] se = Thread.currentThread().getStackTrace();
        //for(int i = 0 ; i < se.length ; i++)  {
        //    System.out.println("????   ["+i+"]="+se[i].getMethodName());
        //}
        String m = null;
        try  {
            m = Thread.currentThread().getStackTrace()[2].getMethodName();
        }  catch(Exception e)  {
            return;
        }

然後拿到現在呼叫 logStart 的 method,就可以拿到他的 annotation...
        if(mpAno.containsKey(m))  {
            JUnitTestAnnotation an = (JUnitTestAnnotation)mpAno.get(m);
            logger.info("===Junit method: " + cName +"."+m);
            logger.info("===測試名稱: " + an.testName());
            logger.info("===輸入參數: " + an.testInput());
            logger.info("===預期結果: " + an.testResult());
            if(an.testMemo() != null && an.testMemo().length() > 0)  {
                logger.info("===備註: " + an.testMemo());
            }
        }

\(^_^)/然後就可以很方便的產生一堆制式的log了~

沒有留言: