美文网首页
Junit单元测试与反射机制

Junit单元测试与反射机制

作者: Binary_r | 来源:发表于2019-04-19 19:08 被阅读0次

一、搭建环境:

导入junit.jar包(junit4)

二、写测试类:

0,一般一个类对应一个测试类。
1,测试类与被测试类最好是放到同一个包中(可以是不同的源文件夹)
2,测试类的名字为被测试类的名字加Test后缀。

三:写测试方法:

0,一般一个方法对应一个单元测试方法。
1,测试方法的名字为test前缀加被测试方法的名字,如testAddPerson()。
2,单元测试方法上面要加上@Test注解(org.junit.Test)!
3,单元测试方法不能有参数,也不能有返回值(返回void)!测试的方法不能是静态的方法。

import org.junit.Test;

import junit_test.Test_1;

public class Junit {
    
    @Test
    public void Demo(){
        Test_1 test = new Test_1();
        test.add(4, 5);
    }
}

四、测试方法的基本使用:

1,可以单独执行一个测试方法,也可以一次执行所有的、一个包的、一个类中所有的测试方法。
2,执行完后,显示绿色表示测试成功;显示红色表示测试失败(抛异常后会测试失败)。

五、用于准备环境、清理环境的方法

@Test
表示单元测试方法。

@Before
所修饰的方法应是非static的(且没有参数,返回值为void)。
表示这个方法会在本类中的每个单元测试方法之前都执行一次。

@After
所修饰的方法应是非static的(且没有参数,返回值为void)。
表示这个方法会在本类中的每个单元测试方法之后都执行一次。

@BeforeClass
所修饰的方法应是static的(且没有参数,返回值为void)。
表示这个方法会在本类中的所有单元测试方法之前执行,只执行一次。

@AfterClass
所修饰的方法应是static的(且没有参数,返回值为void)。
表示这个方法会在本类中的所有单元测试方法之后执行,只执行一次。

六、Assert断言工具类、

其中有一些静态的工具方法(不符合期望就抛异常):

assertTrue(...)     参数的值应是true
assertFalse(...)    参数的值应是false  

assertNull(...)     应是null值
assertNotNull(...)  应是非null的值

assertSame(...)     使用==比较的结果为true(表示同一个对象)
AssertNotSame(...)  使用==比较的结果为false

assertEquals(...)   两个对象equals()方法比较结果为true

七、反射机制

反射的原理

1.应用在一些通用性比较高的代码中
2.后面学到的框架,大多数都是使用反射来实现的

  1. 在框架开发中,都是基于配置文件开发的
    ——在配置文件中配置了类,可以通过反射得到类中的 所有内容,可以让类中的某个方法来执行
    4.类中的所有内容:属性、没有参数的构造方法、有参数的构造方法、普通方法

使用反射操作类里面的属性

1、首先获取到 class 类
 Class clazz1=person.class;
 Class clazz2=new person().getClass();
 Class clazz3=Class.forName("day7.Person");
2、操作无参数的构造方法
对一个类进行实例化不使用new,创建一个对象
public void test1() throws Exception {
        //得到 Class
        Class c3=Class.forName("day7.Person");
        //得到 person 实例
        Person p=(Person)c3.newInstance();
        //设置值
        p.setName("张三");
        System.out.println(p.getName());
    }
3、操作有参数的构造方法
public void test2() throws Exception {
        Class c1=Class.forName("day7.Person");
        //传递有参数的构造方法里面的参数类型,类型使用 class 形式传递
        Constructor  cs=c1.getConstructor(String.class,String.class);
        //通过有参数的构造方法设置值
        Person p1=(Person) cs.newInstance("李四","100");
        System.out.println(p1.getId()+" "+p1.getName());
    }
4、使用属性来操作属性
public void test3() {
        try {
        Class cc=Class.forName("day7.Person");
        //得到 person 类的实例
        Person p=(Person) cc.newInstance();
        //通过这个方法得到属性,参数是属性的名称
        Field f1=cc.getDeclaredField("name");
        //操作的是私有属性,不让操作,需要设置可以操作私有属性setAccessible(true)
        f1.setAccessible(true);
        //设置name的值
        f1.set(p , "王五");//相当于 p.name="王五"
        }catch(Exception e) {
            e.printStackTrace();
        }
    }
5、使用泛型操作普通方法

使用 Method 类表示普通方法

    public void test4() throws Exception {
        
        Class c4=Class.forName("day7.Person");
        //得到 Person 实例
        Person p4=(Person) c4.newInstance();
        //得到普通方法
        //传递两个参数,第一个参数:方法名称 第二个参数:通过方法设置的值
        Method  m1=c4.getDeclaredMethod("setname", String.class);
        //让 setName方法执行,执行设置值
        m1.invoke(p4, "哈哈哈");
       System.out.println(p4.getName());
    }
注意:

当操作的方法是静态方法时,因为静态方法的调用是:类名.方法名,不需要类的实例。
在invoke方法的第一个参数写null
m1.invoke(null, "哈哈哈");

相关文章

网友评论

      本文标题:Junit单元测试与反射机制

      本文链接:https://www.haomeiwen.com/subject/ghvcgqtx.html