public class Calculator {
public int add(int a, int b) {
return a+b;
}
public int sub(int a, int b) {
return a-b;
}
}
import com.junit.demo01junit.Calculator;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
public class CalculatorTest {
/**
* 初始化方法
* 用于申请资源,所有测试方法在执行之前都会执行该方法
*/
@Before
public void init() {
System.out.println("init...");
}
/**
* 释放资源方法
* 在所有测试方法执行完之后,都会自动执行该方法
*/
@After
public void close() {
System.out.println("close...");
}
/**
* add测试方法
*/
@Test
public void testAdd() {
Calculator calculator = new Calculator();
int res = calculator.add(1,3);
//创建断言,判断预期值和具体值是否有差别
Assert.assertEquals(10, res);
System.out.println(res);
}
}
反射
概念
将类的各个部分封装为其它对象,这就是反射机制
好处
解耦,增加程序的扩展性
可以在程序运行过程中,操作这些对象
获取Class对象的方式
Class.forName(“全类名”);将字节码加载到内存,返回Class对象
多用于配置文件,将类名配置在文件中
类名.class:通过类名的属性classh获取
多用于参数的传递
对象.getClass():getClass()方法在Object类中定义
多用于对象获取字节码的方式
public class Person {
private String name;
private int age;
public String a;
protected String b;
String c;
private String d;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
", a='" + a + '\'' +
", b='" + b + '\'' +
", c='" + c + '\'' +
", d='" + d + '\'' +
'}';
}
public Person() {
}
public void eat() {
System.out.println("eat...");
}
public void eat (String food) {
System.out.println(food);
}
}
/**
* 获取Class对象的方式
*
* - Class.forName("全类名");将字节码加载到内存,返回Class对象
* - 类名.class:通过类名的属性class获取
* - 对象.getClass():getClass()方法在Object类中定义
*
*/
public class Demo01Reflect {
public static void main(String[] args) throws ClassNotFoundException {
//1、Class.forName("全类名");将字节码加载到内存,返回Class对象
Class cl1 = Class.forName("com.reflect.demo01reflect.Person");
System.out.println(cl1);
//2、类名.class:通过类名的属性classh获取
Class cl2 = Person.class;
System.out.println(cl2);
//3、对象.getClass():getClass()方法在Object类中定义
Person p = new Person();
Class cl3 = p.getClass();
System.out.println(cl3);
//比较三个对象
System.out.println(cl1==cl2); //true
System.out.println(cl2==cl3); //true
}
}
Class对象获取Field
import com.reflect.demo01reflect.Person;
import java.io.FileInputStream;
import java.lang.reflect.Field;
/**
* 获取功能
* 1、获取成员变量
* Field getField(String name)
* 返回一个 Field 对象,它反映此 Class 对象所表示的类或接口的指定公共成员字段。
* Field[] getFields()
* 返回一个包含某些 Field 对象的数组,这些对象反映此 Class 对象所表示的类或接口的所有可访问公共字段。
* Field getDeclaredField(String name)
* 返回一个 Field 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明字段。
* Field[] getDeclaredFields()
* 返回 Field 对象的一个数组,这些对象反映此 Class 对象所表示的类或接口所声明的所有字段。
* 2、获取构造方法
* Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)
* 返回一个 Constructor 对象,该对象反映此 Class 对象所表示的类或接口的指定构造方法。
* Constructor<?>[] getDeclaredConstructors()
* 返回 Constructor 对象的一个数组,这些对象反映此 Class 对象表示的类声明的所有构造方法。
* Constructor<T> getConstructor(Class<?>... parameterTypes)
* 返回一个 Constructor 对象,它反映此 Class 对象所表示的类的指定公共构造方法。
* Constructor<?>[] getConstructors()
* 返回一个包含某些 Constructor 对象的数组,这些对象反映此 Class 对象所表示的类的所有公共构造方法。
* 3、获取成员方法
* Field getDeclaredField(String name)
* 返回一个 Field 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明字段。
* Field[] getDeclaredFields()
* 返回 Field 对象的一个数组,这些对象反映此 Class 对象所表示的类或接口所声明的所有字段。
* Method getMethod(String name, Class<?>... parameterTypes)
* 返回一个 Method 对象,它反映此 Class 对象所表示的类或接口的指定公共成员方法。
* Method[] getMethods()
* 返回一个包含某些 Method 对象的数组,这些对象反映此 Class 对象所表示的类或接口
* (包括那些由该类或接口声明的以及从超类和超接口继承的那些的类或接口)的公共 member 方法。
* 4、获取类名
* String getName()
* 以 String 的形式返回此 Class 对象所表示的实体(类、接口、数组类、基本类型或 void)名称。
*/
public class Demo01Get {
public static void main(String[] args) throws Exception {
//获取Person的Class对象
Class personClass = Person.class;
//1、Field[] getFields() 获取所有的public修饰的成员变量
Field[] fields = personClass.getFields();
for (Field field : fields) {
System.out.println(field);
}
System.out.println("============");
//2、Field getField(String name)
Field a = personClass.getField("a");
//获取成员变量a的值
Person p = new Person();
Object value = a.get(p);
//设置a的值
a.set(p, "张三");
System.out.println(p);
System.out.println("==============");
//3、Field[] getDeclaredFields()
//获取所有的成员变量
Field[] declaredFields = personClass.getDeclaredFields();
for (Field field : declaredFields) {
System.out.println(field);
}
//4、Field getDeclaredField(String name)
Field d = personClass.getDeclaredField("d");
//因为d是私有变量,若要访问要忽略访问权限修饰符的安全检查
d.setAccessible(true); //暴力fan'she
Object value2 = d.get(p);
System.out.println(value2);
}
}
Junit单元测试测试分类黑盒测试白盒测试区别黑盒测试不需要写代码,给出输入,看结果是否符合输出白盒测试需要写代码关注程序的具体执行流程Junit单元测试Junit单元测试为白盒测试使用步骤具体导入环境见收藏夹public class Calculator { public int add(int a, int b) { return a+b; } public int sub(int a, int b) {