A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

Junit单元测试
测试:
        测试代码是否正确, 能否达到预期效果
       
测试分类:
        1. 黑盒测试:不需要写代码, 给输入值, 看程序是否能够输出期望的值
                比如下载一个APP, 随便点点点, APP闪退了
        2. 白盒测试:需要写代码的. 关注程序具体的执行流程
                比如JUnit


JUnit使用步骤:
        1. 定义一个测试类(也叫测试用例)
            包名:xxx.xxx.xx.test
                被测试的类名:   Calculator   
                对应的测试类名: CalculatorTest
        2. 定义测试方法:可以独立运行
                被测试的方法名:       add()      
         对应的测试方法名: testAdd()  
                    建议测试方法的返回值是void, 参数列表是空参
        3. 在方法上加 @Test 注解
        4. 在@Test注解上按 Alt+Enter, 选择 Add 'JUnit4' to Classpath 导入junit依赖环境
        5. 在方法名上右键, 选择 Run '方法名()'

判定结果:
        红色:失败
        绿色:成功.(测试通过)
       
断言: Assert
        使用断言操作来判断结果是否符合预期:
        Assert.assertEquals(期望的结果, 运算的结果);
        如果 期望的结果 和 运算的结果 相等, 则认为测试通过, 否则测试失败
       
测试失败的原因提示:
    java.lang.AssertionError:
    Expected :1    (表示我期望得到的是1)
    Actual   :-1   (但是实际得到的是-1)


@Before: 修饰的方法会"在每个测试方法执行之前"被执行
@After:  修饰的方法会"在每个测试方法执行之后"被执行

注意:
        @Before, @After 修饰的方法可以有多个, 但是谁先执行是由JUnit内部来决定的, 没有明显的规律
        所以不要写多个@Before, @After 修饰的方法


反射

框架:
        半成品软件. 可以在框架的基础上进行软件开发, 简化编码
        比如JUnit就是一个单元测试框架, 它不是一个独立的软件, 而是和我们开发的软件结合, 简化代码测试
       
反射: 将类的各个组成部分, 封装为其他对象, 这就是反射机制
        成员变量(字段): Field类的对象
        构造方法: Constructor类的对象
        成员方法: Method类的对象
        好处:
                1. 可以在程序运行过程中, 操作这些对象
                2. 可以解耦, 提高程序的可扩展性
               
Java代码在计算机中的3个阶段:
        SOURCE: 源代码阶段
        CLASS: 类对象阶段
        RUNTIME: 运行时阶段


获取一个类的字节码对象的3种方式:
        1. Class.forName("全类名")
                将字节码文件加载进内存,返回Class对象
                适用场景: 多用于配置文件,将类名定义在配置文件中. 读取文件, 加载类
        2. 类名.class                         .
                通过类名的属性class获取
                适用场景: 多用于参数的传递  getConstructor(String.class, int .class)
        3. 对象.getClass()
                getClass()方法在Object类中定义
                适用场景: 多用于对象的获取字节码的方式 p.getClass()


反射:Class的方法概述
java.lang.Class<T>类: 表示一个类的字节码对象, 其中包含该类中定义的内容
        // 获取功能
    1. 获取成员变量们
                Field[] getFields(): 获取所有 public 的成员变量
                Field getField(String name): 获取指定名称的 public 的成员变量
                Field[] getDeclaredFields(): 获取所有的成员变量, 不考虑权限修饰符
                Field getDeclaredField(String name): 获取指定名称的成员变量, 不考虑权限修饰符
    2. 获取构造方法们
                Constructor<?>[] getConstructors(): 获取所有 public 的构造方法
                Constructor<T> getConstructor(Class<?>... parameterTypes): 获取指定的 public 的构造方法
                Constructor<?>[] getDeclaredConstructors(): 获取所有的构造方法, 不考虑权限修饰符
                Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes): 获取指定的构造方法, 不考虑权限修饰符
    3. 获取成员方法们:
                Method[] getMethods(): 获取所有 public 的成员方法
                Method getMethod(String name, Class<?>... parameterTypes) : 获取指定的 public 的成员方法
                Method[] getDeclaredMethods(): 获取所有的成员方法, 不考虑权限修饰符
                Method getDeclaredMethod(String name, Class<?>... parameterTypes): 获取指定的成员方法, 不考虑权限修饰符
    4. 获取Class对象代表的类的全类名
                String getName(): 获取当前Class对象代表的类的全类名
        5. 创建对象
                T newInstance(): 使用当前类的空参构造创建一个对象


反射:获取成员变量Field

java.lang.Class<T>类: 表示一个类的字节码对象, 其中包含该类中定义的内容
        // 获取功能
    1. 获取成员变量们
                Field[] getFields(): 获取所有 public 的成员变量
                Field getField(String name): 获取指定名称的 public 的成员变量
                Field[] getDeclaredFields(): 获取所有的成员变量, 不考虑权限修饰符
                Field getDeclaredField(String name): 获取指定名称的成员变量, 不考虑权限修饰符

java.lang.reflect.Field: 表示一个成员变量
        // 成员方法  p1.age  p2.age   Field age   p1.age =10; p2.age = 20;  ageField.set(p2, 20)
        void set(Object obj, Object value): 设置指定对象的成员变量的值
        Object get(Object obj): 获取指定对象的成员变量的值
        void setAccessible(boolean flag): 传true时忽略访问权限修饰符的安全检查. 暴力反射


反射:获取构造方法Constructor
java.lang.Class<T>类: 表示一个类的字节码对象, 其中包含该类中定义的内容
        // 获取构造方法们
        Constructor<?>[] getConstructors(): 获取所有 public 的构造方法
        Constructor<T> getConstructor(Class<?>... parameterTypes): 获取指定的 public 的构造方法
        Constructor<?>[] getDeclaredConstructors(): 获取所有的构造方法, 不考虑权限修饰符
        Constructor<T> getDeclaredConstructor(Class... parameterTypes): 获取指定的构造方法, 不考虑权限修饰符
        T newInstance(): 使用当前类的空参构造创建一个对象
               
java.lang.reflect.Constructor<T>: 表示一个构造方法
        // 成员方法
        T newInstance(Object... initargs): 使用当前构造方法传入参数, 创建对象
        void setAccessible(boolean flag): 注意: 构造方法不能利用此方法忽略权限, 会抛异常


反射:获取成员方法Method
java.lang.Class<T>类: 表示一个类的字节码对象, 其中包含该类中定义的内容
        // 获取成员方法们:
        Method[] getMethods(): 获取所有 public 的成员方法
        Method getMethod(String name, Class<?>... parameterTypes) : 获取指定的 public 的成员方法
        Method[] getDeclaredMethods(): 获取所有的成员方法, 不考虑权限修饰符
        Method getDeclaredMethod(String name, Class<?>... parameterTypes): 获取指定的成员方法, 不考虑权限修饰符
       
java.lang.reflect.Method类: 表示一个成员方法
        // 成员方法
        Object invoke(Object obj, Object... args): 使用指定对象和指定参数值调用此方法
        String getName(): 获取方法名
        void setAccessible(boolean flag): 传true时忽略访问权限修饰符的安全检查. 暴力反射


反射:利用反射实现框架案例
java.lang.Class<T>
        // 成员方法
        ClassLoader getClassLoader(): 返回该类的类加载器
       
        ClassLoader cl = Test.class.getClassLoader();
       
java.lang.ClassLoader: 类加载器
        // 成员方法
        InputStream getResourceAsStream(String name): 读取相对于 out/production/模块名 目录中的文件, 返回一个字节流
       
使用类加载器加载配置文件
        // 随便获取一个类的字节码对象
        Class clazz = 类名.class;
        // 用字节码对象获取类加载器, 可加载bin目录中编译的文件
        ClassLoader classLoader = clazz.getClassLoader();
        // 使用类加载器加载一个文件, 返回一个字节流
        InputStream is = classLoader.getResourceAsStream("相对于src目录的相对路径");
        // 有了字节流, 就可以使用Properties的load(InputStream in)方法读取配置
        Properties p = new Properties();
        p.load(is);
        String value = p.getProperty("key");


注解
注解: Annotation
        JDK 1.5 引入. 也叫元数据, 是一种代码级别的说明
        它可以声明在包, 类, 字段(成员变量), 方法, 局部变量, 方法参数等的前面, 用来对这些元素进行说明

注解: 说明程序的。给计算机看的
注释: 用文字描述程序的。给程序员看的

使用注解: @注解名称

作用分类:
        1. 编写文档: 通过代码里标识的注解生成文档 (生成API文档 @author @version @since @param @return)
        2. 代码分析: 通过代码里标识的注解对代码进行分析 (使用反射)
        3. 编译检查: 通过代码里标识的注解让编译器能够实现基本的编译检查 (@Override)


JDK中预定义的一些注解:
        @Override: 检测被该注解标注的方法是否是"重写"父类(接口)的
        @Deprecated: 该注解标注的内容,表示已过时
        @SuppressWarnings: 压制警告. 一般传递参数all  @SuppressWarnings("all")


0 个回复

您需要登录后才可以回帖 登录 | 加入黑马