JAVA WEB从入门到精通day08 JUnit和反射的学习

本节思维导图

这里写图片描述

JUnit学习

JUnit学习

    JUnit是一个Java语言的单元测试框架。
    JUnit是用于编写和运行可重复的自动化测试的开源测试框架。
    可在官网下载junit jar包。

JUnit的特点

    -JUnit是用于编写和运行测试的开源框架。
    -提供了注释,以确定测试方法。
    -提供断言测试预期结果。
    -提供了测试运行的运行测试。
    -JUnit测试让您可以更快地编写代码,提高质量
    -JUnit是优雅简洁。它是不那么复杂以及不需要花费太多的时间。
    -JUnit测试可以自动运行,检查自己的结果,并提供即时反馈。没有必要通过测试结果报告来手动梳理。
    -JUnit测试可以组织成测试套件包含测试案例,甚至其他测试套件。
    -Junit显示测试进度的,如果测试是没有问题条形是绿色的,测试失败则会变成红色

junit简单示例

要先导入junit的jar包。

我们先创建一个TestJunit类
    public class TestJunit {
        public void add(int a,int b)
        {
            System.out.println(a+b);
        }
    }

这个类里有一个add方法,传入两个值,打印相加的结果。

我们在测试类里来测试这个方法。
public class TestAdd {
    @Test
    public void add()
    {
        TestJunit testJunit=new TestJunit();
        testJunit.add(2, 3);
    }
}
在测试类中直接选择方法名Run  as在junit中,就可以运行。
条形是绿色的,说明通过测试,add方法没问题。 

Java 注解(Annotation),也叫元数据。
一种代码级别的说明。它是JDK1.5及以后版本引入的一个特性,与类、接口、枚举是在同一个层次。
它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释。

Junit注解

这里写图片描述

例子:
    public class TestAdd {
        @Before
        public void before()
        {
            System.out.println("Before....");
        }
        @Test
        public void add()
        {
            TestJunit testJunit=new TestJunit();
            testJunit.add(2, 3);
        }
        @After
        public void after()
        {
            System.out.println("after...");
        }
    }


    结果为
    Before...
    5
    after... 

断言:
断言表示为一些布尔表达式,程序员相信在程序中的某个特定点该表达式值为真,可以在任何时候启用禁用断言验证,因此可以在测试时启用断言而在部署时禁用断言。

JUnit断言

这里写图片描述

例子:
public class Test {
    @Test
    public void test()
    {
        String obj1 = "junit";
        String obj2 = "junit";
        String obj3 = "test";
        String obj4 = "test";
        String obj5 = null;
        int var1 = 1;
        int var2 = 2;
        int[] arithmetic1 = { 1, 2, 3 };
        int[] arithmetic2 = { 1, 2, 3 };

        assertEquals(obj1, obj2);

        assertSame(obj3, obj4);

        assertNotSame(obj2, obj4);

        assertNotNull(obj1);

        assertNull(obj5);

        assertArrayEquals(arithmetic1, arithmetic2);
    }

}

java反射机制

java反射机制简介

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;
这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。

JAVA反射机制功能

-在运行时判断任意一个对象所属的类;
-在运行时构造任意一个类的对象;
-在运行时判断任意一个类所具有的成员变量和方法;
-在运行时调用任意一个对象的方法;
-生成动态代理。    

反射原理

**我们写好的java文件被编译为.class文件,通过jvm把class文件加载到内存中
class文件在内存中其实也被当成类表示,我们就可以通过一些方法获得这个类里面的信息。

**使用反射的时候,首先需要获取到class类,得到了这个类以后
就可以得到class文件里面所有的信息
        -包括属性,构造方法,普通方法。
    得到class类的三种常用方法
    *类名.class
    *对象.getClass()
    *使用Class.forName(“类名”);

**属性通过Filed类获取
**构造方法通过Constructor类获取
**普通方法通过Method类获取

反射机制实战

Person类

public class Person {
    private String name;
    private String id;
    //无参数的构造方法
    Person()
    {   
    }
    //有参数的构造方法
    public Person(String name,String id)
    {
        this.name=name;
        this.id=id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
}

使用反射机制操作构造方法

//操作无参数的构造方法
    TestDemo类
    public class TestDemo {

        public static void main(String[] args) throws Exception {
            //先获取class类
            Class c=Class.forName("cn.cad.test.Person");
            //获取实例,原理就是调用无参数的构造方法
            Person p=(Person) c.newInstance();
            //设置名字
            p.setName("张三");
            System.out.println(p.getName());
        }
    }
//操作有参数的构造方法
    public static void main(String[] args) throws Exception {
        //获取class类
        Class c=Class.forName("cn.cad.test.Person");
        //获取有参数构造方法,里面传递有参数构造方法里面的数据类型,类型使用class形式传递,getConstructors()方法是获取所有的构造方法
        Constructor cs= c.getConstructor(String.class,String.class);
        //获得实例,原理是调用有参数的构造方法
        Person p=(Person)cs.newInstance("李四","002");
        System.out.println(p.getName()+"--"+p.getId());
    }

使用反射机制操作属性

public static void main(String[] args) throws Exception {
        //获取class类
        Class c=Class.forName("cn.cad.test.Person");
        //创建一个实例
        Person p=(Person)c.newInstance();
        //通过名字获取属性
        Field name=c.getDeclaredField("name");
        //设置可以操作private属性,不设置操作private属性的话就会出现异常
        name.setAccessible(true);
        //设置值
        name.set(p, "王五");
        //打印
        System.out.println(name.get(p));
    }

使用反射机制操作普通方法

public class TestDemo {

        public static void main(String[] args) throws Exception {
            // 获取class类
            Class c=Class.forName("cn.cad.test.Person"); 
            //获取实例
            Person p=(Person) c.newInstance();
            //获取方法并且指定方法参数的数据类型
            Method m=c.getDeclaredMethod("setName", String.class);
            //执行方法并传递实例和值
            m.invoke(p, "赵六");
            System.out.println(p.getName());
        }
    }

    如果操作私有方法时,可以 m.setAccessible(true);来设置

    如果操作的是静态方法,则不需要传实例,m.invoke(null,"赵六");
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值