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)

原因:缺少无参构造方法