您的位置:首页 > 编程语言 > Java开发

javaSE_8系列博客——Java语言的特性(四)--注解--(5)-- 如何使用自定义的注解?

2017-05-19 09:00 721 查看
原文的链接地址:https://www.mkyong.com/java/java-custom-annotations-example/

在本教程中,我们将向您展示如何创建两个自定义注释@Test和@TestInfo来模拟一个简单的单元测试框架。

这个单元测试例子是受到这个官方Java注释文章的启发。

1、@Test Annotation

package com.dynamic.test.core;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Test{
public boolean enabled() default true;
}


2、@TesterInfo Annotation

package com.dynamic.test.core;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface TesterInfo{

public enum Priority{//注意:此处有空格!!
LOW, MEDIUM, HIGH
}

Priority priority() default Priority.MEDIUM;

String[] tags() default "";

String createdBy() default "bill";

String lastModified() default "2017-5-18";

}


3、 Unit Test Example

package com.dynamic.test;

import com.dynamic.test.core.Test;
import com.dynamic.test.core.TesterInfo;
import com.dynamic.test.core.TesterInfo.Priority;

@TesterInfo(
priority = Priority.HIGH,
createdBy = "dynamic.com",
tags = {"sales","test"}
)
public class TestExample{

@Test
void testA(){
if(true)
throw new RuntimeException("This test alwasys failed");

}

@Test(enabled = false)
void testB(){

if(false)
throw new RuntimeException("This test alwasys passed");
}

@Test(enabled = true)
void testC(){

if(10>1){}
//do nothing ,this test always passed
}

}


4、 Java reflection – Read the Annotation

package com.dynamic.test;

import java.lang.annotation.Annotation;
import java.lang.reflect.Method;

import com.dynamic.test.core.Test;
import com.dynamic.test.core.TesterInfo;

public class RunTest {

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

System.out.println("Testing...");

int passed = 0, failed = 0, count = 0, ignore = 0;

Class<TestExample> obj = TestExample.class;

// Process @TesterInfo
if (obj.isAnnotationPresent(TesterInfo.class)) {

Annotation annotation = obj.getAnnotation(TesterInfo.class);
TesterInfo testerInfo = (TesterInfo) annotation;

System.out.printf("%nPriority :%s", testerInfo.priority());
System.out.printf("%nCreatedBy :%s", testerInfo.createdBy());
System.out.printf("%nTags :");

int tagLength = testerInfo.tags().length;
for (String tag : testerInfo.tags()) {
if (tagLength > 1) {
System.out.print(tag + ", ");
} else {
System.out.print(tag);
}
tagLength--;
}

System.out.printf("%nLastModified :%s%n%n", testerInfo.lastModified());

}

// Process @Test
for (Method method : obj.getDeclaredMethods()) {

// if method is annotated with @Test
if (method.isAnnotationPresent(Test.class)) {

Annotation annotation = method.getAnnotation(Test.class);
Test test = (Test) annotation;

// if enabled = true (default)
if (test.enabled()) {

try {
method.invoke(obj.newInstance());
System.out.printf("%s - Test '%s' - passed %n", ++count, method.getName());
passed++;
} catch (Throwable ex) {
System.out.printf("%s - Test '%s' - failed: %s %n", ++count, method.getName(), ex.getCause());
failed++;
}

} else {
System.out.printf("%s - Test '%s' - ignored%n", ++count, method.getName());
ignore++;
}

}

}
System.out.printf("%nResult : Total : %d, Passed: %d, Failed %d, Ignore %d%n", count, passed, failed, ignore);

}
}


输出的结果如下图所示:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐