25.单元测试、反射

这篇具有很好参考价值的文章主要介绍了25.单元测试、反射。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一.单元测试

1.1 什么是单元测试

单元测试就是针对最小的功能单元编写测试代码,Java程序最小的功能单元是方法。因此,单元测试就是针对Java方法进行的测试,进而检查方法的正确性。

1.2 目前测试方法是怎么进行的

  • 只有一个main方法,如果一个方法的测试失败了,其他测试方法会受到影响。
  • 无法得到测试的结果报告,需要程序员自己去观察测试是否成功。
  • 无法实现自动化测试。

1.3 Junit

Junit概述

JUnit是使用Java语言实现的单元测试框架,它是开源的,Java开发者都应当学习并使用JUnit编写单元测试。此外,几乎所有的IDE工具都集成了JUnit,这样我们就可以直接在IDE中编写并运行JUnit测试

Junit优点
  • JUnit可以灵活的选择执行哪些测试方法,可以一键执行全部测试方法。
  • Junit可以生成全部方法的测试报告。
  • 单元测试中的某个方法测试失败了,不会影响其他测试方法的测试。

1.4 单元测试快速入门

步骤

第一步:将Junit的jar包导入到项目中。

25.单元测试、反射

第二步:编写测试方法:该测试方法必须是公共的无参数无返回值的非静态方法。

第三步:在测试方法上使用@Test注解,标注该方法是一个测试方法

第四步:在测试方法中完成被测试方法的预期正确性测试。

第五步:选中测试方法,选择“JUnit运行” ,如果测试良好则是绿色;如果测试失败,则是红色

1.5 Junit常用注解

Junit常用注解(Junit 4.xxxx版本):

25.单元测试、反射

Junit常用注解(Junit 5.xxxx版本):

25.单元测试、反射

1.6 代码实例

25.单元测试、反射

二.反射

2.1 反射概述

反射是指对于任何类,在运行的时候,可以获取类的字节码文件对象,然后可以解析类中的全部成分。例如,在运行时,可以得到:

  • 类的构造器对象:Construtor
  • 类的成员变量对象:Field
  • 类的成员方法对象:Method

这种运行时动态获取类信息以及动态调用类中成分的能力称为反射。

2.2 反射的关键

加载完类之后,在堆内存的方法区中就产生了一个Class类型的对象,一个类只有一个Class对象,这个对象就包含了完整的类的结构信息。我们可以通过这个对象看到类的结构。这个对象就像一面镜子,透过这个镜子看到类的结构,所以,我们形象的称之为:反射。

  • 正常方式:类 =》通过new实例化 =》取得实例化对象
  • 反射方式:实例化对象 =》getClass()方法 =》得到类完整的结构

反射的第一步都是先得到编译后的Class文件对象,然后就可以得到Class的全部成分。

25.单元测试、反射

2.3 反射获取类对象

获取Class类的对象,共有三种方式:

  • 方式一:使用Class类中的静态方法forName,装入类,并做类的静态初始化,返回Class的对象代码格式如下:Class c1 = Class.forName("全类名");//全类名就是 src 下的全包名
  • 方式二:JVM将使用类加载器,将类加载到内存,但前提是类还没有装入内存,不做类的初始化工作,返回Class的对象,代码格式如下: Class c2 = 类名.Class
  • 方式三:使用Object类中的getClass方法获取,会对类进行静态初始化,代码格式如下:    Class c3 = 对象.getClass()

25.单元测试、反射

25.单元测试、反射

2.4 反射获取构造器对象

步骤:

  1. 首先得到类对象
  2. 通过类对象获取构造器对象
  3. 使用构造器对象创建类的对象

25.单元测试、反射

Class类中用于获取构造器的方法:

25.单元测试、反射

Constructor类中用于创建对象的方法:

25.单元测试、反射

作用

获取构造器的作用依然是获取一个对象并返回。

注意事项

如果某个构造器是私有的,那么需要打开权限(暴力反射),然后再创建对象。

范例

public class TestDemo {
    //目标:掌握如何获取构造器对象,并利用构造器对象创建对象

    //获取所有公共的构造器对象
    @Test
    public void getConstructors(){
        //1.获得类对象
        Class class1 = Student.class;
        //2.获得所有公共构造器对象
        Constructor[] constructors = class1.getConstructors();
        //3.遍历构造器数组
        for (Constructor constructor : constructors) {
            System.out.println(constructor.getName()+"===>"+constructor.getParameterCount());
        }
    }

    //获取所有的构造器对象,无论构造器是公开的,还是私有的
    @Test
    public void getDeclaredConstructors(){
        //1.获取类对象
        Class class2 = Student.class;
        //2.获取所有构造器对象
        Constructor[] allConstructor = class2.getDeclaredConstructors();
        //3.遍历构造器对象
        for (Constructor constructor : allConstructor) {
            System.out.println(constructor.getName()+"===>"+constructor.getParameterCount());
        }
    }

    //获取单个构造器对象
    @Test
    public void getConstructor() throws Exception{
        //1.获取类对象
        Class class3 = Student.class;
        //2.获取单个构造器
        Constructor constructor = class3.getDeclaredConstructor(String.class,int.class);
        constructor.setAccessible(true);
        //3.通过这个构造器创建对象
        Student s = (Student) constructor.newInstance("张三",12);
        System.out.println(s);

    }

    //获取单个构造器对象,无视构造器的访问权限
    @Test
    public void getDeclaredConstructor() throws Exception{
        //1.获取类对象
        Class class3 = Student.class;
        //2.获取单个构造器
        Constructor constructor = class3.getDeclaredConstructor();
        //3.暴力反射
        constructor.setAccessible(true);
        //4.通过这个构造器创建对象
        Student student = (Student) constructor.newInstance();
        System.out.println(student);
    }
}

2.5 反射获取成员变量对象

步骤:

  1. 首先得到类对象
  2. 从类对象中获取成员变量对象

25.单元测试、反射

Class类中用于获取成员变量的方法:

25.单元测试、反射

Field中用于取值、赋值的方法

25.单元测试、反射

作用

依然是为某个对象中对应的成员变量取值和赋值。

注意事项

如果某个成员变量是私有的,那么需要打开权限(暴力反射),然后再取值、赋值。

代码示例

public class FieldDemo1 {
    //目标:掌握成员变量对象的获取,并对某个对象中相应的成员变量进行取值和赋值

    //通过反射获取所有成员变量对象
    @Test
    public void getFields() throws Exception {
        //1.获取类对象
        Class class1 = Student.class;
        //2.获取所有成员变量对象
        Field[] fields = class1.getDeclaredFields();
        //3.遍历所有成员变量对象
        for (Field field : fields) {
            System.out.println(field.getName()+"===>"+field.getType());
        }

    }

    //通过反射获取一个成员变量并赋值
    @Test
    public void getField() throws Exception {
        //1.获取类对象
        Class class1 = Student.class;
        //2.获取成员变量对象
        Field name = class1.getDeclaredField("name");
        //3.暴力反射
        name.setAccessible(true);
        //4.对成员变量赋值
        Student s = new Student();
        name.set(s,"张三");
        //5.打印对象
        System.out.println(s);
    }

    //通过反射获取一个成员变量并取值
    @Test
    public void getField2() throws Exception {
        //1.获取类对象
        Class class1 = Student.class;
        //2.获取成员变量对象
        Field name = class1.getDeclaredField("name");
        //3.暴力反射
        name.setAccessible(true);
        //4.对成员变量取值
        Student s = new Student("李四",12);
        String s1 = (String) name.get(s);
        //5.打印成员变量
        System.out.println(s1);
    }
}

2.6 反射获取成员方法对象

步骤:

  1. 首先获取类对象
  2. 通过类对象获取Method对象
  3. 运行方法

25.单元测试、反射

Class类中用于获取成员方法的方法:

25.单元测试、反射

Method类中用于触发执行的方法:

25.单元测试、反射

作用

获取成员方法的作用依然是在某个对象中执行此方法

注意事项

如果某个成员方法是私有的,那么需要通过暴力反射打开权限,然后再执行此方法。

2.6 反射的作用

2.6.1 绕过编译阶段为集合添加数据

反射是作用在运行时的技术,此时集合的泛型将不能产生约束了,此时可以为集合存入其他任意类型的元素。

1.原因

泛型只是在编译阶段可以约束集合只能操作某种数据类型,在编译成Class文件进入运行阶段的时候,其真实类型都是不带泛型的集合类型了,泛型相当于被擦除了。

2.代码示例文章来源地址https://www.toymoban.com/news/detail-497077.html

25.单元测试、反射

2.6.2 通用框架的底层原理

1.需求: 给你任意一个对象,在不清楚对象字段的情况可以把对象的字段名称和对应值存储到文件中去。

25.单元测试、反射

2.代码示例

//框架代码:
public class MyBatisUtils {
    public static void save(Object o){
        try (
                PrintStream ps = new PrintStream(new FileOutputStream("junit-reflect-annotation-proxy/src/reflect.txt",true))
                ){
            //1.得到类对象
            Class aClass = o.getClass();
            ps.println("================="+aClass.getSimpleName()+"=================");
            //2.得到类中全部的成员变量对象
            Field[] fields = aClass.getDeclaredFields();
            //3.得到全部成员变量对象的名字和值

            for (Field field : fields) {
                field.setAccessible(true);
                String name = field.getName();
                String  value = field.get(o)+" ";
                //4.保存到文件中
                ps.println(name+"---"+value);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

//测试代码:
public class ReflectDemo1 {
    public static void main(String[] args) {
        //目标:利用反射技术,做一个通用框架
        //向对象中添加数据,并将对象传到框架中
        Student s = new Student("张三",17,'男',12,"3000");
        MyBatisUtils.save(s);

        Tercher t = new Tercher("张三",17,'男',"王标");
        MyBatisUtils.save(t);

    }
}

到了这里,关于25.单元测试、反射的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • java的单元测试和反射

    就是针对最小的功能单元,编写测试代码对其进行正确性测试 Junit单元测试框架: 可以用来对方法进行测试 有点: 可以灵活的编写测试代码,可以针对某个方法进行测试,也支持一键完成对全部方法的自动发测试,且各自独立 测试的方法必须是 公共,无参,无返回值 测试

    2024年04月28日
    浏览(42)
  • 【JAVA】单元测试、反射、注解、动态代理

    @Test 测试方法 @Before 用来修饰实例方法,该方法会在每一个测试方法执行之前执行一次。 @After 用来修饰实例方法,该方法会在每一个测试方法执行之后执行一次。 @Before Class 用来静态修饰方法,该方法会在所有测试方法之前只执行一次。 @After Class 用来静态修饰方法,该方法

    2024年02月11日
    浏览(42)
  • Java高级技术:单元测试、反射、注解

    目录 单元测试 单元测试概述 单元测试快速入门 单元测试常用注解 反射 反射概述 反射获取类对象 反射获取构造器对象 反射获取成员变量对象 反射获取方法对象 反射的作用-绕过编译阶段为集合添加数据 反射的作用-通用框架的底层原理 注解 注解概述 自定义注解 元注解

    2024年01月16日
    浏览(51)
  • Java中的单元测试,反射和枚举

    2024年02月05日
    浏览(54)
  • Java SE 学习笔记(十七)—— 单元测试、反射

    开发好的系统中存在很多方法,如何对这些方法进行测试? 以前我们都是将代码全部写完再进行测试。其实这样并不是很好。在以后工作的时候,都是写完一部分代码,就测试一部分。这样,代码中的问题可以得到及时修复。也避免了由于代码过多,从而无法准确定位到错误

    2024年02月06日
    浏览(54)
  • 现代C++编程实战25-两个单元测试库:C++里如何进行单元测试

    你好,我是吴咏炜。 单元测试已经越来越成为程序员工作密不可分的一部分了。在 C++ 里,我们当然也是可以很方便地进行单元测试的。今天,我就来介绍两个单元测试库:一个是 Boost.Test [1],一个是 Catch2 [2]。 单元测试库有很多,我选择 Boost 的原因我在上一讲已经说过:“

    2024年02月07日
    浏览(42)
  • mockito+junit 单元测试 测试私有方法利用反射去调用提升覆盖率 反射调用时传入参数为 null

    今天公司安排我写单元测试 因为要通过三级认证 公司要求是覆盖率必须达到100% 而在写单元测试的时候 对于是否要测试私有方法一直是一个争议 公司规范 对私有方法也进行测试 代码如下: JudgeUtils 是公司封装的一个工具类 让我们看看 isNull 方法的内部 代码如下: 我现在需

    2024年02月11日
    浏览(48)
  • Day20-【Java SE高级】单元测试 反射 注解 动态代理

    就是针对最小的功能单元(方法),编写测试代码对其进行正确性测试。 1. 咱们之前是如何进行单元测试的?有啥问题? 只能在main方法编写测试代码,去调用其他方法进行测试。 无法实现自动化测试,一个方法测试失败,可能影响其他方法的测试。 无法得到测试的报告,需要程

    2024年04月17日
    浏览(51)
  • 针对mockito框架在单元测试中出现Mybatis-Plus链式调用的解决方案

    1、 调用其他service层方法 2、 调用本service层方法 3、其他问题

    2024年01月24日
    浏览(43)
  • Linux环境下,针对QT软件工程搭建C++Test单元测试环境的操作指南

    C++Test是Parasoft公司出品的一款可以针对C/C++源代码进行静态分析、单元测试、集成测试的测试工具。本文主要讲解如何在Linux环境下,搭建QT插件版的C++Test测试环境。 1、在官网上下载Linux环境下的QT库和QT Creator: 2、先安装依赖文件: 3、解压QT库安装包: 4、配置(用于生成

    2024年01月19日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包