分享如何创建自定义的注解 @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
相关推荐
学习下动态代理模式(关于代理的基础只是有很多帖子都有我就不重复了),做了个注解动态代理的例子, 给那些学习注解或动态代理的初学者。
利用java注解机制,实现自定义注解实例,例子中实现了简单的注解赋值和获取并打印值。
Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 3...
Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 3...
用1、2、2、3、4、5这六个数字,用java写一个main函数,打印出所有不同的排列,如:512234、412345等,要求: "4 "不能在第三位, "3 "与 "5 "不能相连.
本例是通过注解的形式写的cometd服务器端代码。通过spring的自动注入的功能,把cometd的服务可以注入到web controller中,controller可以调用cometd的服务方法向客户端发送任何需要的信息。网上很多例子都是客户端...
web.xml 中定义了一个名为 annomvc 的 Spring MVC 模块,按照 Spring MVC 的契约,需要在 WEB-INF/annomvc-servlet.xml 配置文件中定义 Spring MVC 模块的具体配置。annomvc-servlet.xml 的配置内容如下所示: ...
MyBatis 是一款优秀的持久层框架,可以很方便的在java中实现对数据库的操作。 MyBatis 可以将sql语句映射为...另一种是java注解,书写简便。 博文链接:https://blog.csdn.net/m0_37809890/article/details/88381897
1.JAVA开发的电子地图 2.Java地图编辑器 3.MapXtreme+for+Java例子集+from+MapInfo+KnowledgeBase 4.mapxtreme+for+java+的开发实例 5.有注解.入门用
是一个适合新手的比较好的例子, <!-- 自动扫描该包下面带有注解的类 --> <context:component-scan base-package="com.jxy.java.service" /> <!-- 导入数据库配置文件 --> <context:property-placeholder ...
shiro是apache的一个开源框架,是一个权限管理的框架,实现 用户认证、用户授权 传统使用URL拦截的时候,要将所有的URL都配置起来,繁琐、不易维护 而我们的Shiro实现系统的权限管理,有效提高开发效率,从而...
这是一个使用spring 集成JMS工程实例,带注解,容易学习理解.
下面是使用 @SuppressWarnings 来取消 deprecation 警告的一个例子: public class Test { @Deprecated //在eclipse下运行的时候,方法名上会加一横线 public static void sayHello() { } } public class Test...
4.1. 一个简单的POJO例子 4.1.1. 实现一个默认的(即无参数的)构造方法(constructor) 4.1.2. 提供一个标识属性(identifier property)(可选) 4.1.3. 使用非final的类 (可选) 4.1.4. 为持久化字段声明访问...
注释生成器在 Java 中轻松创建注释实例例子: @interface MyAnnon { String SomeValue () default "has default"; int SomeInt (); // No default value.}// ...@MyAnnon ( SomeInt = 99 )public class DummyClass {...