Junit单元测试、反射、注解
分类
- 黑盒测试,不用写代码,给输入看是否能输出指定结果。
- 白盒测试,需要写代码,关注程序具体的执行流程。
Junit使用
-
定义一个测试类(测试用例)
建议:被测试类名Test,包名 xx.xx.test
-
定义测试方法可以独立运行
test方法名()
返回值 void
参数列表 空参数
-
给方法加@Test注解
-
添加Junit依赖
判定结果
使用断言来判断真实结果和期望值是否相等。
其他
@Before 在测试方法执行前进行,用于资源申请
@After 在测试方法执行之后进行,用于资源释放
public class TestCalculator {
/**
*
*/
@Before
public void init(){
System.out.println("申请资源");
}
/**
* 测试add方法
*
*/
@Test
public void testAdd(){
Calculator calculator = new Calculator();
int result = calculator.add(10,29);
// System.out.println(result);
Assert.assertEquals(30,result);
}
@After
public void close(){
System.out.println("关闭资源");
}
}
反射
将类的各个组成部分封装为对象。
好处
- 可以在程序运行过程中操作这些对象
- 可以解耦,提高程序的可扩展性
获取class的方式
-
Class.forName(“包+类名”)
多用于配置文件
-
类名.class
多用于参数传递
-
对象.getClass()
同一个字节码文件.class 在程序运行过程中只会加载一次,三种方式获取的class对象都是同一个。
注解
-
编写文档
通过注解生成文档
命令行 使用
javadoc 文件.java
抽取处注解的文字生成html的参考文档。 -
代码分析
使用反射
-
编译检查
如override
预定义
@Override
@Deprecated 表示已过时
@SuppressWarnings(“all”) 压制左右警告
@SuppressWarnings("all")
public class AnnotationTest {
自定义注解
格式
public @interface MyAnnotation {
int show();
// // 赋值默认值,不用再使用时赋值
String name() default "Jhon";
}
使用
@MyAnnotation(show = 10)
public void eat(String name) {
System.out.println(name + "正在吃饭");
return;
}
本质
- 继承了Annotation的接口
属性
- 接口中定义的成员方法
- 定义的成员方法的返回值只能以下取值
- 基本数据类型
- String
- 枚举
- 注解
- 以上类型的数组
- 属性名为value时,可以直接写值,不用写value=xx
元注解
- 描述注解的注解
-
@Target:描述注解作用的位置
ElementType.TYPE, // 作用于类 ElementType.FIELD, // 作用于变量 ElementType.METHOD // 作用于方法
-
@Retention: 描述注解被保留的阶段,一般用RUNTIME
@Retention(RetentionPolicy.RUNTIME) // 注解会被保留到.class 文件中,被JVM读取到
-
@Documented : 描述注解是否被抽取到api文档中
加了这个注解的,注解名称会在API文档中显示
-
@Inherited:描述注解是否被子类继承
在程序中解析注解
注解一般在程序中替代配置文件
- 获取注解定义位置的对象
- 获取指定注解
- 调用注解中的抽象方法获取值
Class<ReflectTest> reflectTestClass = ReflectTest.class;
// 获取指定类型注解
// 在内存中生成了一个该注解接口的子类实现对象
Properties annotation = reflectTestClass.getAnnotation(Properties.class);
// 调用注解中的抽象方法
String s = annotation.className();
System.out.println(s);