软件构造试验的所学所感(1)Lab1

本文介绍如何运用Java反射机制测试私有方法。通过设置方法的可访问性,可以在JUnit测试环境中调用并验证私有方法的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

软件构造试验的所学所感(1)Lab1

在编写Lab1代码的时候,遇到的一些困难所得到了一些启发,在学习一些类库的时候也掌握了很多技巧。

本篇介绍如何利用反射机制编写Test文件以测试private方法

背景:

在编写程序的时候基本都是要用Juinit5来进行单元测试,这对于public修饰符修饰的方法而言测试类可以正常调用该方法,但由于private修饰的方法是不允许其他类调用的,所以此时必须要用到JAVA里反射部分的知识。

  • 先介绍关于反射的部分知识以便于接下来的讲解

  • 反射,即能够分析类能力的程序。Java里的反射库提供了一个非常丰富且精心设计的工具集,以便编写能够动态操纵Java代码的程序。由于反射功能极其强大,所以其可以使用在许多地方,如:

    • 在运行时分析类的能力
    • 在运行时查看对象,例如,编写一个toString方法供所有类使用。
    • 实现通用的数组操作代码
    • 利用Method对象,该对象类似于C++中的函数指针

示例代码如下:

Method testmyaddVertex = mygraph.getClass().getDeclaredMethod("addVertex", Person.class);
Method testmyaddVertex = stuClass.getDeclaredMethod("addVertex", Person.class);
testmyaddVertex.setAccessible(true);
Object my_result = ArrayList <Person> person_vertex_text = new ArrayList<Person>();
Person rachel = new Person("Rachel");
Person ross = new Person("Ross");
Person ben = new Person("Ben");
Person kramer = new Person("Kramer");
Person wrong = new Person("Ben");
		//设置并可以提取使用private字段 mygraph.person_vertex
Field f = mygraph.getClass().getDeclaredField("person_vertex");
Field f = mygraph.getDeclaredField("person_vertex");
f.setAccessible(true);
Object myaddVertex = mygraph.newInstance() ;
f.get(mygraph);
System.out.print(f.get(mygraph));
assertEquals(person_vertex_text, f.get(mygraph));         //此处设置好需要检验的变量 ArrayList <Person> person_vertex

//此处可以调用private方法  addVertex()

testmyaddVertex.invoke(mygraph, rachel);
person_vertex_text.add(rachel);
assertEquals(person_vertex_text, f.get(mygraph));

获取反射类的方法目前我使用的有两种

 1. Class c = SubjectService.class 
 2. Class c =Class.forName(SubjectService)

前者只需要调用类自带的class 方法即可,后者需要利用Class的forName方法其中它的输入参数要求是完整的类名(必要时还有加上包名.)

  • 在我的代码里我是直接通过类自带方法getClass()

获取了类c之后,因为要修改private方法使得测试类可以调用该方法,因此需要通过

  • subjectService.class.getDeclaredMethod(autoMatchConfig.getMethodName(),Integer.class)

  • 其等同于c.getDeclaredMethods()
    其中输入参数第一个是方法名字,第二个是方法参数 如我的代码中:

    Method testmyaddVertex = stuClass.getDeclaredMethod(“addVertex”, Person.class);

之后要修改访问权限

testmyaddVertex.setAccessible(true);

即可。
然后为了可以调用该方法,需要有一个该类的实例比如mygraph
之后便可以调用方法,利用Method的方法invoke

testmyaddVertex.invoke(mygraph, rachel);

其中方法的输入参数第一个是该方法所属类的实例,第二个是调用该方法所需要的参数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值