`

Java注解实例----一个简单的单元测试例子

    博客分类:
  • java
阅读更多

分享如何创建自定义的注解 @Test 和 @TestInfo 去模拟一个简单的单元测试框架。

 

1. @Test Annotation

 

package com.testunit.demo;

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 enable() default true;
}

 

 

2. @TestInfo Annotation

@TestInfo放在class上,存储测试的信息。这里演示返回不同的类型 - enum, array, string

 

package com.testunit.demo;

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 TestInfo {

	public enum Priority{
		LOW, MEDIUM,HIGH
	}
	
	public Priority priority() default Priority.MEDIUM;
	public String[] tags() default "";
	public String createBy() default "Matt-jarvi";
	public String lastModified() default "2016-2-24";
}

 3. 单元测试例子

 

创建一个简单的测试用例,并且用新的自定义注解

 

package com.testunit.demo;

import com.testunit.demo.TestInfo.Priority;

@TestInfo(priority=Priority.LOW,
			tags = {"testExample","test"},
			createBy = "jarvi-matt",
			lastModified = "02/24/2016"
		  
		)
public class TestExample {
	
	@Test
	public void testA(){
		throw new RuntimeException("这个例子总是失败!");	
	}
	
	
	@Test(enable = false)
	public void testB(){
		//System.out.println("测试enable = false的情况");
	}
	
	@Test(enable = true)
	public void testC(){
		//System.out.println("测试enable = true的情况");
	}

}

 

 

4. Java 反射 - 处理注解

下面的例子演示如何用Java的反射APIs 去处理自定义的注解

 

package com.testunit.demo;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Arrays;

public class RunTest {

	public static void main(String[] args) {
		System.out.println("Testing...");
		
		int passed = 0;
		int failed = 0;
		int count = 0;
		int ignore = 0;
		
		
		Class<TestExample> clazz = TestExample.class;
		
		//解析@TesterInfo
		//如果存在,得到@TesterInfo的信息并打印
		if(clazz.isAnnotationPresent(TestInfo.class)){
			TestInfo testInfo = clazz.getAnnotation(TestInfo.class);
			
			System.out.println("测试信息如下:");
			System.out.printf("%nTestClass :%s",clazz.getSimpleName());
			System.out.printf("%nPriority :%s",testInfo.priority());
			System.out.printf("%nCreateBy :%s",testInfo.createBy());
			System.out.printf("%nLastModified :%s",testInfo.lastModified());
			System.out.printf("%nTags :%s%n%n",Arrays.asList(testInfo.tags()));
		}
		
		//解析@Test
		for(Method method : clazz.getDeclaredMethods()){
			
			if(method.isAnnotationPresent(Test.class)){
				
				Test test = method.getAnnotation(Test.class);
				//test为true 执行该方法,否则不执行
				if(test.enable() == true){
					try {
						
						method.invoke(clazz.newInstance());
						System.out.printf("%n%s - 测试'%s'执行完成 - 通过",++count,method.getName());
						passed++;
					} catch (Exception e) {
						failed++;
						System.out.printf("%n%s - 测试'%s'执行完成 - 失败: %s ",++count,method.getName(),e.getCause());
					} 
				}else{
					System.out.printf("%n%s - 测试'%s'不执行 - 忽略",++count,method.getName());
					ignore++;
				}
					
				
				
			}
			 
		}
		
		System.out.printf("%n%nResult >> Total : %s, Passed: %s, Failed: %s, Ignore: %s",count,passed,failed,ignore);

	}

}

 

 

运行结果:

 

Testing...
测试信息如下:

TestClass :TestExample
Priority :LOW
CreateBy :jarvi-matt
LastModified :02/24/2016
Tags :[testExample, test]


1 - 测试'testB'不执行 - 忽略
2 - 测试'testA'执行完成 - 失败: java.lang.RuntimeException: 这个例子总是失败! 
3 - 测试'testC'执行完成 - 通过

Result >> Total : 3, Passed: 1, Failed: 1, Ignore: 1

 

 

References

  1. Wikipedia : Java annotation
  2. Oracle JavaSE docs – annotations
  3. ElementType JavaDoc
  4. RetentionPolicy JavaDoc
  5. Java Custom Annotations Example
分享到:
评论

相关推荐

    Java 注解+动态代理的一个实例

    学习下动态代理模式(关于代理的基础只是有很多帖子都有我就不重复了),做了个注解动态代理的例子, 给那些学习注解或动态代理的初学者。

    java自定义注解

    利用java注解机制,实现自定义注解实例,例子中实现了简单的注解赋值和获取并打印值。

    JAVA上百实例源码以及开源项目源代码

     Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 3...

    JAVA上百实例源码以及开源项目

     Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 3...

    一个关于java实现的迭代用法例子,太经典了

    用1、2、2、3、4、5这六个数字,用java写一个main函数,打印出所有不同的排列,如:512234、412345等,要求: "4 "不能在第三位, "3 "与 "5 "不能相连.

    cometd注解实现java端代码实例

    本例是通过注解的形式写的cometd服务器端代码。通过spring的自动注入的功能,把cometd的服务可以注入到web controller中,controller可以调用cometd的服务方法向客户端发送任何需要的信息。网上很多例子都是客户端...

    springweb3.0MVC注解(附实例)

    web.xml 中定义了一个名为 annomvc 的 Spring MVC 模块,按照 Spring MVC 的契约,需要在 WEB-INF/annomvc-servlet.xml 配置文件中定义 Spring MVC 模块的具体配置。annomvc-servlet.xml 的配置内容如下所示: ...

    基于注解的MyBatis使用实例

    MyBatis 是一款优秀的持久层框架,可以很方便的在java中实现对数据库的操作。 MyBatis 可以将sql语句映射为...另一种是java注解,书写简便。 博文链接:https://blog.csdn.net/m0_37809890/article/details/88381897

    java 开发地图 开发实例 入门

    1.JAVA开发的电子地图 2.Java地图编辑器 3.MapXtreme+for+Java例子集+from+MapInfo+KnowledgeBase 4.mapxtreme+for+java+的开发实例 5.有注解.入门用

    一个整合ssm框架的实例

    是一个适合新手的比较好的例子, &lt;!-- 自动扫描该包下面带有注解的类 --&gt; &lt;context:component-scan base-package="com.jxy.java.service" /&gt; &lt;!-- 导入数据库配置文件 --&gt; &lt;context:property-placeholder ...

    Java EE常用框架.xmind

    shiro是apache的一个开源框架,是一个权限管理的框架,实现 用户认证、用户授权 传统使用URL拦截的时候,要将所有的URL都配置起来,繁琐、不易维护 而我们的Shiro实现系统的权限管理,有效提高开发效率,从而...

    spring中集成JMS使用工程实例..eclipse项目例子,带注解.导入即可运行.

    这是一个使用spring 集成JMS工程实例,带注解,容易学习理解.

    Java 高级特性.doc

    下面是使用 @SuppressWarnings 来取消 deprecation 警告的一个例子: public class Test { @Deprecated //在eclipse下运行的时候,方法名上会加一横线 public static void sayHello() { } } public class Test...

    Hibernate_3.2.0_符合Java习惯的关系数据库持久化

    4.1. 一个简单的POJO例子 4.1.1. 实现一个默认的(即无参数的)构造方法(constructor) 4.1.2. 提供一个标识属性(identifier property)(可选) 4.1.3. 使用非final的类 (可选) 4.1.4. 为持久化字段声明访问...

    Annotation-Builder:从 Java 中的注解接口轻松创建实例

    注释生成器在 Java 中轻松创建注释实例例子: @interface MyAnnon { String SomeValue () default "has default"; int SomeInt (); // No default value.}// ...@MyAnnon ( SomeInt = 99 )public class DummyClass {...

Global site tag (gtag.js) - Google Analytics