Junit单元测试、反射、注解相关

    技术2022-07-11  67

    文章目录

    Junit单元测试:白盒测试的一种反射:框架设计的灵魂注解反射案例(加载配置文件的信息)注解案例

    Junit单元测试:白盒测试的一种

    * 测试分类: 1.黑盒测试:不需要写代码,给输入值,看程序是否能够输出期望的值 2.白盒测试:需要写代码,关注程序具体的执行流程 * Junit的使用: 1.定义一个测试类(测试用例) * 建议: * 测试类名:被测试的类名Test,例如:CalculatorTest * 包名:xxx.xxx.xxx.test ,例如:com.new.test 2.定义测试方法:可以独立运行 * 建议: * 方法名:test测试的方法名 ,例如:testAdd() * 返回值:void * 参数列表:空参 3.给方法加注解:@test,导入Junit环境依赖 * 判定结果 * 红色:失败 * 绿色:成功 * 一般我们会使用断言操作来处理结果,例如: Assert.assertEquals(期望结果,实际结果); * 补充: * @Before:修饰的方法会在测试方法之前被自动执行 * @After:修饰的方法会在测试方法之后自动被执行

    反射:框架设计的灵魂

    * 框架:半成品软件。可以在框架的基础上进行软件开发,简化编码 * 反射:将类的各个组成部分封装为其他对象,这就是反射机制 * 好处: 1.可以在运行程序中,操作这些对象 2.可以解耦,提高程序的可扩展性 * 获取class对象的三种方式 1.Class.forName("全类名"):将字节码文件加载进内存,返回class对象 2.类名.class:通过类名的属性class获取 3.对象.getClass() * Class对象功能: * 获取功能: 1.获取成员变量 * Field[] getFields():只能获取public修饰的成员变量 * Field getField(string name ):只能获取指定名字的public修饰的成员变量 * Field[] getDeclaredFields():获取所有的成员变量,不考虑修饰符 * Field getDeclaredField(string name ):获取指定名称的成员变量,不考虑修饰符 2.获取构造方法们 * Constructor<?>getconstructors() * Constructor<T>getConstructor(类<?>... parameterTypes) * Constructor<T>getDeclaredConstructor(类<?>... parameterTypes ) * Constructor<?>getDeclaredConstructors() 3.获取成员方法们: * Method[] getMethods() * Method getMethod(String name,类<?>... parameterTypes) * Method[] getDec laredMethods() * Method getDeclaredMethod(string name,类<?>... parameterTypes ) 4.获取类名 * string getName() * Field成员变量 * 操作: 1.设置值:void set(Object obj,Object value) 2.获取值:get(Object obj) 3.忽略访问权限修饰符的安全检查: setAccessible(true);//暴力反射 * Constructor:构造方法 * 创建对象: * T newInstance(Object... initargs) * 如果使用空参数构造方法创建对象,操作可以简化:class对象的newInstance() 方法 * Method:方法对象 * 执行方法: * Object invoke(Object obj, Object... args) * 获取方法名字: * getName()

    注解

    * 概念:说明程序的,给计算机看的 * 概念描述: * jdk1.5之后的新特性 * 说明程序的 * 使用注解:@注解名称 * 注释:用文字描述程序 * java中预定义的一些注解 * @Override:检测被该注解标注的方法是否是继承自父类 * @Deprecated:该注解标注的内容表示已过时 * @SuppressWarnings:压制警告,一般传递参数为"all" * 自定义注解 * 格式:元注解+public @interface 注解名称 {属性列表;} * 本质:注解本质上就是一个接口,该接口继承Annotation接口 * 属性:接口中的成员方法 * 要求: 1.属性的返回值类型: * 基本数据类型 * string * 枚举 * 注解 * 以上类型的数组 2.定义了属性,在使用时需要给属性赋值 * 元注解:用于描述注解的注解 * @Target:描述注解能够作用的位置 * ElementType取值: * TYPE:可以作用于类上 * METHOD:可以作用于方法上 * FIELD:可以作用于成员变量上 * @Retention:描述注解被保留的一个阶段 * @Retention(RetentionPolicy.RUNTIME):当前被描述的注解,会保留到class字节码文件中,并被jvm读取到 * @Documented:描述注解是否被抽取到api中 * @Inherited:描述注解是否被子类继承 * 程序中使用注解 1.获取注解定义位置的对象 2.获取指定注解 3.调用注解中的抽象方法获取配置的属性值

    反射案例(加载配置文件的信息)

    /** 定义配置文件(配置文件里的类名和方法名是自定义的) */ className=com.dsl.entity.Student methodName=sleep public static void main(String[] args) throws Exception { /** * 不改变任何代码,可以创建任意类的对象,可以执行任意方法 */ //创建Properties对象 Properties properties = new Properties(); //加载配置文件 ClassLoader classLoader = ReflectTest.class.getClassLoader(); InputStream stream = classLoader.getResourceAsStream("pro"); properties.load(stream); //获取配置文件里的数据 String className = properties.getProperty("className"); String methodName = properties.getProperty("methodName"); //加载类进内存 Class<?> aClass = Class.forName(className); //创建对象 Object o = aClass.newInstance(); //获取方法对象 Method method = aClass.getMethod(methodName); method.invoke(o); }

    注解案例

    //自定义注解 package com.dsl.annotation; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) public @interface Pro { String className(); String methodName(); } //通过解析注解调用类里面的方法 package com.dsl.annotation; import java.lang.reflect.Method; @Pro(className = "com.dsl.entity.Person",methodName = "eat") public class ReflectTest { public static void main(String[] args) throws Exception { /** * 不改变任何代码,可以创建任意类的对象,可以执行任意方法 */ //解析注解 //获取注解对象 Class<ReflectTest> reflectTestClass = ReflectTest.class; Pro annotation = reflectTestClass.getAnnotation(Pro.class); //调用注解里的抽象方法 String className = annotation.className(); String methodName = annotation.methodName(); Class<?> aClass = Class.forName(className); Object o = aClass.newInstance(); Method method = aClass.getMethod(methodName); method.invoke(o); } }
    Processed: 0.009, SQL: 9