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
2、@TesterInfo Annotation
3、 Unit Test Example
4、 Java reflection – Read the Annotation
输出的结果如下图所示:
在本教程中,我们将向您展示如何创建两个自定义注释@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); } }
输出的结果如下图所示:
相关文章推荐
- javaSE_8系列博客——Java语言的特性(四)--注解--(1)--基础知识
- javaSE_8系列博客——Java语言的特性(四)--注解--(3)-- 预定义注解
- JavaSE_8系列博客——Java语言的特性(五)--接口和继承(6)--默认方法的使用场景
- javaSE_8系列博客——Java语言的特性(四)--注解--(2)-- 声明一个注解
- javaSE_8系列博客——Java语言的特性(三)--类和对象(21)--何时使用Lambda 表达式?
- javaSE_8系列博客——Java语言的特性(四)--注解--(4)-- 类型注解和可插拔类型系统
- javaSE_8系列博客——Java语言的特性(三)--类和对象(10)--对象的使用
- javaSE_8系列博客——Java语言的特性(五)--接口和继承(4)--使用接口作为类型
- JavaSE_8系列博客——Java语言的特性(六)--泛型(2)--何时何地使用泛型?
- JavaSE_8系列博客——Java语言的特性(六)--泛型(5)--泛型的使用
- javaSE_8系列博客——Java语言的特性(三)--类和对象(12)--使用this关键字
- javaSE_8系列博客——Java语言的特性(三)--类和对象(17)--嵌套类(本地/局部类)
- javaSE_8系列博客——Java语言的特性(二)--高级语言的基础知识(4)-- 变量和数组
- javaSE_8系列博客——Java语言的特性(三)--类和对象(9)--对象的创建
- javaSE_8系列博客——Java语言的特性(三)--类和对象(5)--定义方法
- javaSE_8系列博客——Java语言的特性(三)--类和对象(11)--从方法返回值
- javaSE_8系列博客——Java语言的特性(三)--类和对象(12)--类成员的访问控制
- javaSE_8系列博客——Java语言的特性(三)--类和对象(14)--初始化字段
- javaSE_8系列博客——Java语言的特性(三)--类和对象(1)--概述
- javaSE_8系列博客——Java语言的特性(三)--类和对象(6)--为你的类提供构造函数