分享如何创建自定义的注解 @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
相关推荐
在上面的例子中,`value()`就是一个属性。 3. **使用**: 在代码中,可以将自定义注解应用于目标元素,如: ```java public class MyClass { @MyAnnotation(value = "Hello, World!") public void myMethod() {...
至于测试,我们可以使用@SpringBootTest注解来启动一个Spring Boot测试环境,配合@MockBean或@SpyBean可以模拟Bean的行为,方便单元测试。 在“testannotation”这个文件中,可能包含了一些示例代码,如测试类、...
Java是一种广泛使用的面向对象的编程语言,以其跨平台、健壮性和安全性著称。这份"java讲义和实例——ppt"资源是专为Java初学者准备的,旨在帮助他们掌握编程基础并逐步深入理解Java的核心概念。 讲义部分通常会...
Java是一种广泛使用的面向对象的编程语言,以其跨平台...每个例子都可能是一个独立的功能模块,通过组合这些模块,开发者可以构建出复杂的应用系统。不断实践和理解这些例子,将有助于提升你的编程技能和问题解决能力。
在Java中,每一个实例都可能包括以下几个步骤:问题定义、需求分析、代码实现、测试和调试。通过这些实例,开发者不仅可以学习到Java语法,还能了解到良好的编程实践,如代码组织、错误处理和性能优化。 此外,这些...
SSH(Struts2 + Spring + Hibernate)是一种经典的Java Web开发框架组合,用于构建高效、可维护的Web应用程序。...同时,注解的使用也是现代Java开发中的一个重要趋势,熟悉这些注解将有助于适应更多的Java框架和库。
本文将通过一个具体的例子来展示如何结合使用注解和动态代理技术。 #### 二、关键概念解析 ##### 1. **动态代理** - **定义**:动态代理是指在运行时动态创建代理对象的过程。这种机制可以用来为任何接口类型的...
本教程将通过一个超市自动售卖机的例子来详细讲解如何在Java中实现自定义注解。 首先,我们需要了解注解的基本结构。在Java中,注解以`@`符号开头,后面跟着注解的名称。自定义注解的定义类似于接口,但使用`@...
Junit作为Java领域最常用的单元测试框架,为开发者提供了简单易用的API来进行测试。本案例涵盖了Spring和Struts两大框架的单元测试,旨在帮助开发者掌握如何对这两个流行的Java Web框架进行有效的测试。 一、Junit...
Java反射是Java编程语言中的一个强大工具,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java 8中,虽然没有引入重大的反射新特性,但原有的反射API仍然提供了丰富的功能,使得开发者...
Java注解是Java 5.0引入的一个重要特性,用于向代码添加元数据,而不影响其实际功能。它们为开发过程中的自动化工具、编译器检查、运行时元数据读取等提供了强大的功能。本文将深入探讨Java注解的概念、用途、定义及...
JUnit是Java编程语言中最流行的单元测试框架,它提供了丰富的断言方法和测试注解,使得编写和执行单元测试变得简单易行。本篇文章将深入探讨JUnit4的单元测试实例,帮助你更好地理解和应用这个工具。 一、JUnit4...
"140个Java源码实例"是一份珍贵的学习资源,它包含了多个实际编程场景下的代码示例,旨在帮助初学者更好地理解和掌握Java编程。 在学习这140个Java源码实例时,我们可以按照以下主要知识点进行分类和深入学习: 1....
Java是一种广泛使用的面向对象的编程语言,以其跨平台、高性能和丰富的类库而著名。"75个Java实例"提供了一系列...对于初学者来说,这是一个极好的起点;对于经验丰富的开发者,这些实例也可以作为快速参考或灵感来源。
由于抽象类自身不能被实例化,这意味着你不能使用`new`关键字直接创建一个抽象类的对象。然而,尽管不能直接实例化,抽象类在特定情况下依然可以间接地创建对象。以下将详细介绍如何在Java中处理抽象类实例化的问题...
在Java学习过程中,实例是掌握概念和技术的关键。这个"JAVA学习实例15个"的压缩包文件提供了一系列的练习和示例,旨在...对于"010279-01"这个文件,可能是系列中的第一个例子,建议首先从这个开始,逐步深入其他实例。
"Java编程71-100例"是一份涵盖了多种Java编程概念和技巧的实例集合,旨在帮助开发者深入理解和掌握Java语言的核心特性。下面,我们将对这些实例涉及的主要知识点进行详细解读。 1. 类与对象:Java是一种面向对象的...
例如,可能有一个名为"TestService"的类,它使用@Service注解声明为一个Spring管理的bean。然后,这个类可能包含一个字段,如@Autowired注解的某个Repository接口,这表明Spring容器会在运行时自动注入对应的...
本例子就是一个使用 Spring AOP 注解实现的项目,旨在展示如何在简单的环境中应用这一特性。 1. **AOP 基础概念** - **切面(Aspect)**: 包含一组相关功能的模块,这些功能在多个对象中都可能被用到,比如日志、...
无状态SessionBean(Stateless Session Bean)代表了一个业务逻辑单元,它不保存任何客户端的状态信息。这意味着每次客户端调用Bean的方法时,都会得到一个全新的、独立的Bean实例,不会记住之前的操作。无状态...