Junit单元测试与反射

1.Junit单元测试

测试分类:
1.黑盒测试:不需要写代码,看不到程序执行的过程,输入一些参数,是否能看到预期的结果。
2.白盒测试:需要写代码,可以看到程序执行的过程,输入一些参数,是否能看到预期的结果。
Junit使用:白盒测试
首先看一个例子:

package com.wcy.demo1.Junit;

/*
    计算器类
 */
public class Calculator {
    /**
     * 加法
     * @param a
     * @param b
     * @return
     */
    public int add(int a,int b){
        return a+b;
    }

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

package com.wcy.demo1.Junit;

public class demoJunit {
    public static void main(String[] args) {
        //创建对象
        Calculator c=new Calculator();
        int result1 = c.add(1, 2);
        System.out.println(result1);

        int result2 = c.sub(5, 1);
        System.out.println(result2);

    }
}

以上使用这样的方法比较繁琐,不方便
一个类只能写一个main方法。那么单元测试就会解决这种问题。

步骤:
1.定义一个测试类(测试用例)
建议:
测试类名:测试的类名Test
包名:xxx.xxx.xx.Test
2.定义测试方法:可以独立运行
建议:
方法名:Test测试名的方法
返回值:void
参数列表:空参
3.给方法加注解
4.导入Junit依赖

package test;

import com.wcy.demo1.Junit.Calculator;

public class CalculatorTest {
    /**
     * 测试add方法
     */
    @Test
    public void testAdd(){
        //System.out.println("我被执行了");
        Calculator calculator=new Calculator();
        int result = calculator.add(1, 2);
        //System.out.println(result);
        //断言,我断言这个结果是3
        Assert.assertEquals(3,result);
    }
}

判定结果:红色代表失败,绿色代表成功,一般我们会用断言操作处理结果。Assert.assertEquals(3,result);

5.初始化方法,用于资源申请,所有测试方法在执行前都会先执行该方法 在方法前加上@Before
6.释放资源方法,在所有测试方法执行完后,都会自动执行该方法,在方法前加@After

2.反射:框架设计的灵魂

2.1 反射的基本概述

框架:半成品软件。可以在框架的基础上进行软件开发,简化编码。
概念(抽象):将类的各个组成部分封装为其他对象,这就是反射机
制。

在这里插入图片描述
好处:
1.可以在程序运行过程中,操作这些对象。
2.可以解耦,提高程序的可扩展性。

从上一张图看到:Class类对象阶段有三个功能
1.获取成员变量
2.获取构造方法
3.获取成员方法

下面我们使用代码来介绍一下它们。

2.2反射:获取成员变量

1.首先我们创建一个Person类

package reflect;

public class Person {
    private  int age;
    private String name;

    public String a;
    protected String b;
    String c;
    private String d;

    @Override
    public String toString() {
        return "Person{" +
                "age=" + age +
                ", name='" + name + '\'' +
                ", a='" + a + '\'' +
                ", b='" + b + '\'' +
                ", c='" + c + '\'' +
                ", d='" + d + '\'' +
                '}';
    }
    
    public Person(){

    }

    public Person(int age, String name) {
        this.age = age;
        this.name = name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public int getAge() {
        return age;
    }
}

2.创建完成后我们就可以通过反射来获取Class对象

Field[ ] getFields():获取所有public修饰的成员变量
Field getField(String name):获取指定名称的public修饰的成员变量
Field[] getDeclaredFields():获取所有的成员变量,不考虑修饰符
Field getDeclaredField(String name)
注意:d.setAccessible(true);//暴力反射

package reflect;

import java.lang.reflect.Field;

public class ReflectDemo1 {
    public static void main(String[] args) throws Exception {
        //1.获取Person的Class对象
        Class personClass = Person.class;
        //2.获取成员变量
        /*
            Field[] getFields():获取所有public修饰的成员变量
            Field getField(String name):获取指定名称的public修饰的成员变量
         */

        Field[] fields = personClass.getFields();
        for (Field field : fields) {
            System.out.println(field);//public java.lang.String reflect.Person.a
        }

        System.out.println("===========================");
        Field a = personClass.getField("a");
        //获取成员变量a的值
        Person p=new Person();
        Object value = a.get(p);
        System.out.println(value);//null
        //设置a的值
        a.set(p,"张三");
        System.out.println(p);//Person{age=0, name='null', a='张三', b='null', c='null', d='null'}

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

        //Field[] getDeclaredFields():获取所有的成员变量,不考虑修饰符
        Field[] declaredFields = personClass.getDeclaredFields();
        for (Field declaredField : declaredFields) {
            System.out.println(declaredField);
            /*输出结果
            private int reflect.Person.age
            private java.lang.String reflect.Person.name
            public java.lang.String reflect.Person.a
            protected java.lang.String reflect.Person.b
            java.lang.String reflect.Person.c
            private java.lang.String reflect.Person.d
            */

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


        //Field getDeclaredField(String name)
        Field d = personClass.getDeclaredField("d");
        //忽略访问权限修饰符的安全检查
        d.setAccessible(true);//暴力反射
        Object value2 = d.get(p);
        System.out.println(value2);
    }
}

2.3反射:获取构造方法

1.首先,还是创建Person类

package reflect;

public class Person {
    private String name;
    private  int age;


    public String a;
    protected String b;
    String c;
    private String d;
    public Person(){

    }

    @Override
    public String toString() {
        return "Person{" +
                "age=" + age +
                ", name='" + name + '\'' +
                ", a='" + a + '\'' +
                ", b='" + b + '\'' +
                ", c='" + c + '\'' +
                ", d='" + d + '\'' +
                '}';
    }

    public Person(String name,int age) {
        this.name = name;
        this.age = age;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public int getAge() {
        return age;
    }
}

2.其次,再使用

package reflect;

import java.lang.reflect.Constructor;

public class ReflectDemo2 {
    public static void main(String[] args) throws Exception {
        //1.获取Person的Class对象
        Class personClass = Person.class;
        //2.获取构造方法
        /*
            Constructor<?>[] getConstructors()
         */
        //Constructor<?>[] getConstructors()
        Constructor constructor = personClass.getConstructor(String.class,int.class);
        System.out.println(constructor);//public reflect.Person(java.lang.String,int)
        //创建对象
        Object person = constructor.newInstance("张三", 23);
        System.out.println(person);//Person{age=23, name='张三', a='null', b='null', c='null', d='null'}

        System.out.println("========================");
        Constructor constructor1 = personClass.getConstructor();
        System.out.println(constructor1);//public reflect.Person()
        //创建对象
        Object person1 = constructor1.newInstance();
        System.out.println(person1);//Person{age=0, name='null', a='null', b='null', c='null', d='null'}

        Object o = personClass.newInstance();
        System.out.println(o);//Person{age=0, name='null', a='null', b='null', c='null', d='null'}

    }
}

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

2.4反射:获取成员方法

1.首先还是创建Person类

package reflect;

public class Person {
    private String name;
    private  int age;


    public String a;
    protected String b;
    String c;
    private String d;
    public Person(){

    }

    @Override
    public String toString() {
        return "Person{" +
                "age=" + age +
                ", name='" + name + '\'' +
                ", a='" + a + '\'' +
                ", b='" + b + '\'' +
                ", c='" + c + '\'' +
                ", d='" + d + '\'' +
                '}';
    }

    public Person(String name,int age) {
        this.name = name;
        this.age = age;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public int getAge() {
        return age;
    }

    public void eat(){
        System.out.println("吃吃吃吃.......");
    }

    public void eat(String food){
        System.out.println("吃吃吃吃......."+food);
    }
}

2.使用

package reflect;

import java.lang.reflect.Method;

public class ReflectDemo3 {
    public static void main(String[] args) throws Exception {
        //1.获取Person的Class对象
        Class personClass = Person.class;
        //2.获取成员方法
        //获取指定名称的方法
        Method eat_method = personClass.getMethod("eat");
        Person p=new Person();
        //执行方法
        eat_method.invoke(p);//吃吃吃吃.......

        Method eat_method2 = personClass.getMethod("eat", String.class);
        //执行方法
        eat_method2.invoke(p,"屁");

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

获取方法:
执行方法:Object invoke(Object obj,Object… args)
获取方法名称:String getName:获取方法名

2.5反射:获取类名

和之前一样:

//获取类名
        String ClassName = personClass.getName();
        System.out.println(ClassName);//reflect.Person
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值