1.Junit单元测试
测试分类:
1.黑盒测试:不需要写代码,看不到程序执行的过程,输入一些参数,是否能看到预期的结果。
2.白盒测试:需要写代码,可以看到程序执行的过程,输入一些参数,是否能看到预期的结果。
Junit使用:白盒测试
首先看一个例子:
package com.wcy.demo1.Junit;
/*
计算器类
*/
public class Calculator {
/**
* 加法
* @param a
* @param b
* @return
*/
public int add(int a,int b){
return a+b;
}
/**
* 减法
* @param a
* @param b
* @return
*/
public int sub(int a,int b){
return a-b;
}
}
package com.wcy.demo1.Junit;
public class demoJunit {
public static void main(String[] args) {
//创建对象
Calculator c=new Calculator();
int result1 = c.add(1, 2);
System.out.println(result1);
int result2 = c.sub(5, 1);
System.out.println(result2);
}
}
以上使用这样的方法比较繁琐,不方便
一个类只能写一个main方法。那么单元测试就会解决这种问题。
步骤:
1.定义一个测试类(测试用例)
建议:
测试类名:测试的类名Test
包名:xxx.xxx.xx.Test
2.定义测试方法:可以独立运行
建议:
方法名:Test测试名的方法
返回值:void
参数列表:空参
3.给方法加注解
4.导入Junit依赖
package test;
import com.wcy.demo1.Junit.Calculator;
public class CalculatorTest {
/**
* 测试add方法
*/
@Test
public void testAdd(){
//System.out.println("我被执行了");
Calculator calculator=new Calculator();
int result = calculator.add(1, 2);
//System.out.println(result);
//断言,我断言这个结果是3
Assert.assertEquals(3,result);
}
}
判定结果:红色代表失败,绿色代表成功,一般我们会用断言操作处理结果。Assert.assertEquals(3,result);
5.初始化方法,用于资源申请,所有测试方法在执行前都会先执行该方法 在方法前加上@Before
6.释放资源方法,在所有测试方法执行完后,都会自动执行该方法,在方法前加@After
2.反射:框架设计的灵魂
2.1 反射的基本概述
框架:半成品软件。可以在框架的基础上进行软件开发,简化编码。
概念(抽象):将类的各个组成部分封装为其他对象,这就是反射机
制。
好处:
1.可以在程序运行过程中,操作这些对象。
2.可以解耦,提高程序的可扩展性。
从上一张图看到:Class类对象阶段有三个功能
1.获取成员变量
2.获取构造方法
3.获取成员方法
下面我们使用代码来介绍一下它们。
2.2反射:获取成员变量
1.首先我们创建一个Person类
package reflect;
public class Person {
private int age;
private String name;
public String a;
protected String b;
String c;
private String d;
@Override
public String toString() {
return "Person{" +
"age=" + age +
", name='" + name + '\'' +
", a='" + a + '\'' +
", b='" + b + '\'' +
", c='" + c + '\'' +
", d='" + d + '\'' +
'}';
}
public Person(){
}
public Person(int age, String name) {
this.age = age;
this.name = name;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setAge(int age) {
this.age = age;
}
public int getAge() {
return age;
}
}
2.创建完成后我们就可以通过反射来获取Class对象
Field[ ] getFields():获取所有public修饰的成员变量
Field getField(String name):获取指定名称的public修饰的成员变量
Field[] getDeclaredFields():获取所有的成员变量,不考虑修饰符
Field getDeclaredField(String name)
注意:d.setAccessible(true);//暴力反射
package reflect;
import java.lang.reflect.Field;
public class ReflectDemo1 {
public static void main(String[] args) throws Exception {
//1.获取Person的Class对象
Class personClass = Person.class;
//2.获取成员变量
/*
Field[] getFields():获取所有public修饰的成员变量
Field getField(String name):获取指定名称的public修饰的成员变量
*/
Field[] fields = personClass.getFields();
for (Field field : fields) {
System.out.println(field);//public java.lang.String reflect.Person.a
}
System.out.println("===========================");
Field a = personClass.getField("a");
//获取成员变量a的值
Person p=new Person();
Object value = a.get(p);
System.out.println(value);//null
//设置a的值
a.set(p,"张三");
System.out.println(p);//Person{age=0, name='null', a='张三', b='null', c='null', d='null'}
System.out.println("============================");
//Field[] getDeclaredFields():获取所有的成员变量,不考虑修饰符
Field[] declaredFields = personClass.getDeclaredFields();
for (Field declaredField : declaredFields) {
System.out.println(declaredField);
/*输出结果
private int reflect.Person.age
private java.lang.String reflect.Person.name
public java.lang.String reflect.Person.a
protected java.lang.String reflect.Person.b
java.lang.String reflect.Person.c
private java.lang.String reflect.Person.d
*/
}
System.out.println("============================");
//Field getDeclaredField(String name)
Field d = personClass.getDeclaredField("d");
//忽略访问权限修饰符的安全检查
d.setAccessible(true);//暴力反射
Object value2 = d.get(p);
System.out.println(value2);
}
}
2.3反射:获取构造方法
1.首先,还是创建Person类
package reflect;
public class Person {
private String name;
private int age;
public String a;
protected String b;
String c;
private String d;
public Person(){
}
@Override
public String toString() {
return "Person{" +
"age=" + age +
", name='" + name + '\'' +
", a='" + a + '\'' +
", b='" + b + '\'' +
", c='" + c + '\'' +
", d='" + d + '\'' +
'}';
}
public Person(String name,int age) {
this.name = name;
this.age = age;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setAge(int age) {
this.age = age;
}
public int getAge() {
return age;
}
}
2.其次,再使用
package reflect;
import java.lang.reflect.Constructor;
public class ReflectDemo2 {
public static void main(String[] args) throws Exception {
//1.获取Person的Class对象
Class personClass = Person.class;
//2.获取构造方法
/*
Constructor<?>[] getConstructors()
*/
//Constructor<?>[] getConstructors()
Constructor constructor = personClass.getConstructor(String.class,int.class);
System.out.println(constructor);//public reflect.Person(java.lang.String,int)
//创建对象
Object person = constructor.newInstance("张三", 23);
System.out.println(person);//Person{age=23, name='张三', a='null', b='null', c='null', d='null'}
System.out.println("========================");
Constructor constructor1 = personClass.getConstructor();
System.out.println(constructor1);//public reflect.Person()
//创建对象
Object person1 = constructor1.newInstance();
System.out.println(person1);//Person{age=0, name='null', a='null', b='null', c='null', d='null'}
Object o = personClass.newInstance();
System.out.println(o);//Person{age=0, name='null', a='null', b='null', c='null', d='null'}
}
}
创建对象:
1.T newInstance(Object…initargs)
2.如果使用空参数构造方法创建对象,操作可以简化:Class对象的newInstance方法
2.4反射:获取成员方法
1.首先还是创建Person类
package reflect;
public class Person {
private String name;
private int age;
public String a;
protected String b;
String c;
private String d;
public Person(){
}
@Override
public String toString() {
return "Person{" +
"age=" + age +
", name='" + name + '\'' +
", a='" + a + '\'' +
", b='" + b + '\'' +
", c='" + c + '\'' +
", d='" + d + '\'' +
'}';
}
public Person(String name,int age) {
this.name = name;
this.age = age;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setAge(int age) {
this.age = age;
}
public int getAge() {
return age;
}
public void eat(){
System.out.println("吃吃吃吃.......");
}
public void eat(String food){
System.out.println("吃吃吃吃......."+food);
}
}
2.使用
package reflect;
import java.lang.reflect.Method;
public class ReflectDemo3 {
public static void main(String[] args) throws Exception {
//1.获取Person的Class对象
Class personClass = Person.class;
//2.获取成员方法
//获取指定名称的方法
Method eat_method = personClass.getMethod("eat");
Person p=new Person();
//执行方法
eat_method.invoke(p);//吃吃吃吃.......
Method eat_method2 = personClass.getMethod("eat", String.class);
//执行方法
eat_method2.invoke(p,"屁");
System.out.println("=====================");
//获取所有public修饰符的方法
Method[] methods = personClass.getMethods();
for (Method method : methods) {
System.out.println(method);
String name = method.getName();
System.out.println(name);
}
}
}
获取方法:
执行方法:Object invoke(Object obj,Object… args)
获取方法名称:String getName:获取方法名
2.5反射:获取类名
和之前一样:
//获取类名
String ClassName = personClass.getName();
System.out.println(ClassName);//reflect.Person