Junit单元测试
测试分类:
黑盒测试:不需要写代码,给输入值,看流程是否能够输出期望值
白盒测试:需要写代码,关注程序具体的执行流程
a)定义一个测试类
i. 测试类名:被测试的类名Test FunctionTest
ii. 包名:xxx.xxx.xx.test cn.ycl.test
b)定义一个测试方法:可以独来运行
i. 方法名:test测试的方法名 testAdd()
ii. 返回值:void
iii.参数列表:空参
c)给方法加@Test
d)导入junit依赖环境
判定结果:
a) 红色:失败
b)绿色:成功
c) 一般使用断言操作来处理结果:Assert.assertEquals(期望值,实际值);
补充:
a)@before:修饰的方***在测试方法之前自动被执行
b)@After:修饰的方***在测试方法之后自动被执行
反射:框架设计的灵魂
框架:半成品软件,可以在框架的基础上进行软件开发,简化编码
反射:将类的各个组成部分封装为其他对象,这就是反射
好处:
可以在程序运行过程中,操作这些对象
可以解耦,提高程序的可扩展性
获取class对象的方式:
1.Class.forName(“全类名”):将字节码文件加载进内存,返回class对象
*多用于配置文件,将类名定义在配置文件,读取文件,加载类
2.类名.class.:通过类名的属性class获取
*多用于参数的传递
3.对象.getClass():getClass()方法在Object类中定义着
*多用于对象的获取字节码的方式
结论:同一个字节码文件(*.class)在一次程序运行过程中,只会被加载一次,不论通过哪种方式获取的class对象都是同一个
Class对象功能:
获取功能:
1.获取成员变量们
a)Field[ ] getFields():获取所有public修饰的成员变量
b)Field getField(String name)
c)Field[ ] getDeclaredFields( ):获取所有的成员变量
i.访问私有变量时,要忽略访问权限修饰符的安全检查
ii. 暴力反射:*.setAccessible(true);
d)Field getDeclaredField(String name)
Field操作:
i.设置值: void set(Object obj, Object value)
ii.获取值:get(Object obj)
2.获取构造方法们
a)Constructor<?>[ ] getConstructors( )
b)Constructor<T> getConstructor(类<?>…parameterTypes)
c)Constructor<?>[ ] getDeclaredConstructors( )
d)Constructor<T> getDeclaredConstructor(类<?>…parameterTypes)
Constructor构造方法:T getDeclaredConstructor().newInstance()
3.获取成员方法们
a)Method[ ] getMethods( )
b)Method getMethod(String name,类<?>…parameterTypes )
c)Method[ ] getDeclaredMethods( )
d)Method getDeclaredMethod(String name,类<?>…parameterTypes )
Method方法对象:
4.获取类名
a)String getName( )
案例需求:写一个“框架”,可以帮外面创建任意类对象
代码:
1 package Reflect;
2
3 import java.io.InputStream;
4 import java.lang.reflect.Method;
5 import java.util.Properties;
6
7 public class ReflectTest {
8 public static void main(String[] args) throws Exception {
9 /* 10 * 可以创建任意类的对象,可以执行任意方法 11 * 前提:不能改变该类的任何代码,可以创建任意类的对象,可以执行任意方法 12 * */
13 //1.创建Properties对象
14 Properties pro = new Properties();
15 //2.加载配置文件,转换为一个集合
16 //3.获取class目录下的配置文件
17 ClassLoader classLoader = ReflectTest.class.getClassLoader();
18 InputStream is = classLoader.getResourceAsStream("pro.properties");
19 pro.load(is);
20 //4.获取配置文件中定义的数据
21 String className = pro.getProperty("className");
22 String methodName = pro.getProperty("methodName");
23 //5.加载该类进内存
24 Class cls = Class.forName(className);
25 //6.创建对象
26 Object obj = cls.getDeclaredConstructor().newInstance();
27 //7.获取方法对象
28 Method method = cls.getMethod(methodName);
29 //执行方法
30 method.invoke(obj);
31
32 }
33 }
34 class Person{
35 private String name = "ycl";
36 private int age = 21;
37
38 public void info(){
39 System.out.println("info...");
40 }
41
42 public Person() {
43 }
44
45 public Person(String name, int age) {
46 this.name = name;
47 this.age = age;
48 }
49
50 public String getName() {
51 return name;
52 }
53
54 public void setName(String name) {
55 this.name = name;
56 }
57
58 public int getAge() {
59 return age;
60 }
61
62 public void setAge(int age) {
63 this.age = age;
64 }
65 }
66 class Student extends Person{
67 public Student(){
68 }
69 public Student(String name, int age) {
70 super(name, age);
71 }
72 public void study(){
73 System.out.println("study....");
74 }
75 }
76
77 //pro.properties文件
78 className =Reflect.Person
79 methodName = info
异常;
Exception in thread "main" java.lang.NoSuchMethodException: Reflect.Person.<init>()
at java.base/java.lang.Class.getConstructor0(Class.java:3350)
at java.base/java.lang.Class.getDeclaredConstructor(Class.java:2554)
at Reflect.ReflectTest.main(ReflectTest.java:26)
原因:缺少无参构造方法