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

原文的链接地址: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);

	}
}


输出的结果如下图所示:



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值