Junit单元测试、反射

目录

Junit单元测试

测试分类

Junit使用:白盒测试

反射

反射概念

获取class对象的三种方式 

Class对象功能

获取成员变量

获取构造方法

获取成员方法 


Junit单元测试

测试分类

         1. 黑盒测试:不需要写代码,给输入值,看程序是否能够输出期望的值。
         2. 白盒测试:需要写代码。关注程序具体的执行流程。

Junit使用:白盒测试

          步骤
                   1. 定义测试类(测试用例)
                   2. 定义测试方法:可以独立运行
                   3. 给方法加@Test
                   4. 导入junit依赖环境

          判定结果:
                   1.  红色:失败。 绿色:成功
                   2.  一般我们会使用断言(不知道为啥起这个骚名字)操作来处理结果
                                --   Assert.assertEquals(期望的结果,运算的结果);

          补充:
                   * @Before:
                                * 修饰的方法会在测试方法之前被自动执行
                   * @After:
                                * 修饰的方法会在测试方法执行之后自动被执行
 测试类:

package Junit;
/**
 *  计算器类
 */
public class Calcultor {
    /**
     *  加法
     */
    public int add(int a,int b){
        return a+b;
    }

    /**
     *  减法
     */
    public int sub(int a, int b){
        return a-b;
    }
}

测试方法:

package Junit_Test;

import Junit.Calcultor;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;

/**
 *  算器测试类
 */
public class CalcultorTest {
    /**
     *  初始化方法
     *      用于资源申请,所以测试方法执行之前都会执行该方法
     */
    @Before
    public void init(){
        System.out.println("初始化方法。。。。。。");
    }

    /**
     *  释放资源方法
     *      在所有测试方法执行完后,都会自动执行该方法
     */
    @After
    public void close(){
        System.out.println("释放资源方法。。。。。。");
    }

    /**
     *  测试add方法
     */
    @Test
    public void TestAdd() {
        //  1.创建计算器对象
        Calcultor c = new Calcultor();
        //  2.调用add方法
        int sum = c.add( 1, 2 );
        //  3.断言
        Assert.assertEquals( 3, sum );
    }

    /**
     *  测试sub方法
     */
    @Test
    public void TestSub() {
        Calcultor c = new Calcultor();
        int sub = c.sub( 3, 2 );
        Assert.assertEquals( 1, sub );
    }
}

反射

反射概念

          JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性。这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。    
         要想解剖一个类,必须先要获取到该类的字节码文件对象。而解剖使用的就是Class类中的方法.所以先要获取到每一个字节码文件对应的Class类型的对象.
         JAVA通常是先有类再有对象,有对象我就可以调用方法或者属性。反射其实是通过Class对象(字节码文件对象)来调用类里面的方法。通过反射可以调用私有方法和私有属性。

获取class对象的三种方式 

          1. Class.forName("全类名"):将字节码文件加载进内存,返回Class对象
                 * 多用于配置文件,将类名定义在配置文件中。读取文件,加载类。-----------(最常用)
          2. 类名.class:通过类名的属性class获取
                 * 多用于参数的传递
          3. 对象.getClass():getClass()方法在Object类中定义着。
                 * 多用于对象的获取字节码的方式

package demo1;

/**
 *  * 获取Class对象的方式:
         1. Class.forName("全类名"):将字节码文件加载进内存,返回Class对象
             * 多用于配置文件,将类名定义在配置文件中。读取文件,加载类
         2. 类名.class:通过类名的属性class获取
             * 多用于参数的传递
         3. 对象.getClass():getClass()方法在Object类中定义着。
             * 多用于对象的获取字节码的方式
 */
public class GetClass {
    public static void main(String[] args) throws ClassNotFoundException {
        Class classname01 = Class.forName( "demo1.Person" );
        System.out.println(classname01);

        Class classname02 = Person.class;
        System.out.println(classname02);

        Person p=new Person();
        Class classname03 = p.getClass();
        System.out.println(classname03);
    }
}

=====================================================
class demo1.Person
class demo1.Person
class demo1.Person

Process finished with exit code 0

Class对象功能

获取成员变量

         * Field[] getFields() :获取所有public修饰的成员变量
         * Field getField(String name) 获取指定名称的 public修饰的成员变量
         * Field[] getDeclaredFields() 获取所有的成员变量,不考虑修饰符
         * Field getDeclaredField(String name)

操作
        1. 设置值
            * void set(Object obj, Object value)  
        2. 获取值
            * get(Object obj) 

        3. 忽略访问权限修饰符的安全检查
            * setAccessible(true):暴力反射

package demo1;

import java.lang.reflect.Field;

/**
 * 获取成员变量
 * Field[] getFields() :获取所有public修饰的成员变量
 * Field getField(String name)   获取指定名称的 public修饰的成员变量
 * <p>
 * Field[] getDeclaredFields()  获取所有的成员变量,不考虑修饰符
 * Field getDeclaredField(String name)
 */
public class GetFiled {
    public static void main(String[] args) throws Exception{
        //  获取class对象
        Class personClass = Person.class;

        //  1.Field[] getFields() :获取所有public修饰的成员变量
        Field[] field = personClass.getFields();
        for (Field field1 : field) {
            System.out.println( field1 );
        }

        System.out.println( "====================" );
        //  2.获取指定名称的 public修饰的成员变量
        Field name = personClass.getField( "name" );
        //  获取成员变量a的值
        Person person = new Person();
        Object obj = name.get(person);
        System.out.println(obj);
        //  设置成员变量a的值
        name.set( person,"小太阳" );
        System.out.println(person);

        System.out.println("=====================");
        //  3.获取所有的成员变量,不考虑修饰符
        Field[] declaredFields = personClass.getDeclaredFields();
        for (Field declaredField : declaredFields) {
            System.out.println(declaredField);
        }

        Field sex = personClass.getField( "sex" );
        // 忽略访问权限修饰符的安全检查
        //  暴力反射
        sex.setAccessible( true );
        Object o = sex.get( person );
        System.out.println(o);
    }
}

=====================================================================================
测试结果:
public java.lang.String demo1.Person.name
public int demo1.Person.age
====================
null
Person{name='小太阳', age=0, sex='null'}
=====================
public java.lang.String demo1.Person.name
public int demo1.Person.age
private java.lang.String demo1.Person.sex
null

Process finished with exit code 0

获取构造方法

     * Constructor<?>[] getConstructors()
     * Constructor<T> getConstructor(类<?>... parameterTypes)
     * Constructor<T> getDeclaredConstructor(类<?>... parameterTypes)
     * Constructor<?>[] getDeclaredConstructors()

操作:
            * 创建对象:
            * T newInstance(Object... initargs)
            * 如果使用空参数构造方法创建对象,操作可以简化:Class对象的newInstance方法

package demo1;

import java.lang.reflect.Constructor;

/**
 *  获取构造方法
 *      Constructor<?>[] getConstructors()
 *      Constructor<T> getConstructor(类<?>... parameterTypes)

 *      Constructor<T> getDeclaredConstructor(类<?>... parameterTypes)
 *      Constructor<?>[] getDeclaredConstructors()
 */
public class GetConstructor {
    public static void main(String[] args) throws Exception{
        //  获取class对象
        Class personClass = Person.class;

        //  获取构造器
        Constructor constructor = personClass.getConstructor( String.class, int.class, String.class );
        System.out.println(constructor);

        // 创建对象
        Object person = constructor.newInstance( "张三", 18, "男" );
        System.out.println(person);

    }
}

=====================================================================================
测试结果:
public demo1.Person(java.lang.String,int,java.lang.String)
Person{name='张三', age=18, sex='男'}

Process finished with exit code 0

获取成员方法 

package demo1;

import java.lang.reflect.Method;

/**
 *  获取成员方法:Method
 *  Method:执行方法
 *      Method[] getMethods()
 *      Method getMethod(String name, 类<?>... parameterTypes)

 *      Method[] getDeclaredMethods()
 *      Method getDeclaredMethod(String name, 类<?>... parameterTypes)
 */
public class GetMethod {
    public static void main(String[] args) throws  Exception{
        //  获取class对象
        Class personClass = Person.class;

        //  获取指定名称的无参成员方法
        Method eat_Method1 = personClass.getMethod( "eat" );
        Person p=new Person();
        //  传递对象,执行方法
        eat_Method1.invoke( p );

        //  获取指定名称的带参成员方法
        Method eat_Method2 = personClass.getMethod( "eat", String.class );
        Person p2=new Person();
        //  传递对象,执行方法
        eat_Method2.invoke( p2 ,"苹果");

        System.out.println("===============================");

        //  获取所有public修饰的方法
        Method[] methods = personClass.getMethods();
        for (Method method : methods) {
            System.out.println(method);
            //  获取方法名字
            String name = method.getName();
            System.out.println(name);
        }
    }
}


测试结果:
eat...........
eat........苹果
===============================
public java.lang.String demo1.Person.toString()
toString
public java.lang.String demo1.Person.getName()
getName
public void demo1.Person.setName(java.lang.String)
setName
public void demo1.Person.setSex(java.lang.String)
setSex
public int demo1.Person.getAge()
getAge
public void demo1.Person.eat()
eat
public void demo1.Person.eat(java.lang.String)
eat
public java.lang.String demo1.Person.getSex()
getSex
public void demo1.Person.setAge(int)
setAge
public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
wait
public final void java.lang.Object.wait() throws java.lang.InterruptedException
wait
public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
wait
public boolean java.lang.Object.equals(java.lang.Object)
equals
public native int java.lang.Object.hashCode()
hashCode
public final native java.lang.Class java.lang.Object.getClass()
getClass
public final native void java.lang.Object.notify()
notify
public final native void java.lang.Object.notifyAll()
notifyAll

Process finished with exit code 0

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值