先說,為了做 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了~
沒有留言:
張貼留言