Junit单元测试
Junit使用:
步骤:
*1.定义一个测试类(建议Test)
*2.包名:xxx.xxx.Test
*3.测试方法:可以独立运行
*方法名:建议test,参数直接为空,给某个方法加个@Test
*@Before 在方法前面加上,会在所有方法执行前执行,相当于构造函数
*@After 在方法前面加上,会在所有方法执行后执行,相当于析构函数
*4.导入Junit的依赖环境
*5.断言:
*Java中的Assert类提供了公共接口
反射:框架设计的灵魂
*框架是半成品,可以在框架的基础上进行软件开发,简化编码
*反射:将类的各个组成部分封装成为其他对象,这就是反射机制
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QDiWQQUf-1618327607870)(C:\Users\Lenovo\AppData\Roaming\Typora\typora-user-images\image-20210316204711848.png)]
*好处:
*1.可以在程序运行中,操纵这些对象
*2.可以解耦,可以提高程序的可扩展性
*获取class类的方法:
1.Class.forName(“全类名”):将自己尔玛文件加载之内存中,返回class对象
2.类名.class:通过类名的属性class获取
3.对象.getClass():getClass方法在Object类中,所有对象都可以访问
同一个字节码文件在一个程序运行中,class字节码文件只被加载一次,可以用==比较类的地址值
class对象的功能:
*获取字节码的功能:
1.获取成员变量名 Field[] getFields()
Field getField(String name)
Field[] getDeclaredFields()
Field getDeclaredField(String name)
2.获取构造方法名,
Constructor<?>[] getConstructors()
Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)
Constructor<?>[] getConstructors()
Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)
3.获取成员方法名
Method[] getMethods()
Method getMethod(String name, Class<?>... parameterTypes)
Constructor<?>[] getDeclaredConstructors()
Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)
4.获取类名
String getName()
Field对象成员变量
1.设置值, set()
2.获取值,get()
3.忽略访问权限,setAccessible(true)暴力反射
注意:不能獲取private屬性的,主要是獲取變量,然後设置值,
Constructor构造方法:
可以使用newInstance()方法
也可以使用Class的newInstance方法
Method对象功能:
执行方法,对象.invoke()
案例:
*需求:写一个“框架”,不改变任意代码,可以帮我们创建任意对象,执行任意方法
Caculator.java
package Junit;
/**
* 计算器
*/
public class Caculator {
public int a;
public String s;
private int b;
public Caculator(int a,int b)
{
this.a=a;this.b=b;
}
public Caculator(String s,int t)
{
this.s=s;a=t;
}
public Caculator()
{
}
public int add(int a,int b)
{
return a+b;
}
public int jian(int a, int b)
{
return a-b;
}
@Override
public String toString()
{
return s+a;
}
}
CaculatorText.java
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
public class CaculatorText {
/**
* 初始化方法:
* 在方法前面加上 @Before
* 该方法用于申请资源,会在所有方法执行前执行
*/
@Before
public void CaculatorTest()
{
System.out.println("init");
}
/**
* 在方法前面加上 @After
* 析构函数,释放内存,该方法会在所有方法运行完后释放
*/
@After
public void close()
{
System.out.println("free");
}
/**
* 用Junit测试代码
*/
@Test
public void test()
{
Caculator c = new Caculator();
int res = c.add(1,2);
//断言:我断言这个数字是3
Assert.assertEquals(3,res);
System.out.println(res);
res = c.jian(1,2);
System.out.println(res);
}
}
reflect.java
package Junit;
public class reflect {
/**
* 获取class类的方法:
*
* 1.Class.forName("全类名"):将自己尔玛文件加载之内存中,返回class对象
*
* 2.类名.class:通过类名的属性class获取
*
* 3.对象.getClass():getClass方法在Object类中,所有对象都可以访问
*/
public static void main(String[] args) {
//1.Class.forName("全类名")
try {
Class cls1 = Class.forName("Junit.Caculator");
System.out.println(cls1);
}
catch (Exception e)
{
System.out.println("Error");
}
//2.类名.class
Class cls2 = Caculator.class;
System.out.println(cls2);
//3.对象.getClass()
Caculator c = new Caculator();
Class cls3 = c.getClass();
System.out.println(cls3);
}
}
ReflectDemo2.java
package Junit;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class ReflectDmo2 {
/*
获取字节码的功能:
注意不能獲取private方法
1.获取成员变量名 Field[] getFields()
Field getField(String name)
Field[] getDeclaredFields()
Field getDeclaredField(String name)
2.获取构造方法名,
Constructor<?>[] getConstructors()
Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)
Constructor<?>[] getConstructors()
Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)
3.获取成员方法名
Method[] getMethods()
Method getMethod(String name, Class<?>... parameterTypes)
Constructor<?>[] getDeclaredConstructors()
Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)
4.获取类名
String getName()
*/
public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
//1
Class cls = Caculator.class;
Field[] fields= cls.getFields();
for(Field field : fields)
{
System.out.println(field);
}
try {
Field field = cls.getField("a");
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
Caculator c =new Caculator();
Field a= null;
try {
a = cls.getField("a");
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
try {
Object value = a.get(c);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
try {
a.set(c,111);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
a.setAccessible(true);//暴力反射
System.out.println(c);
//2
Constructor constructor = cls.getConstructor(String.class, int.class);
Object person = constructor.newInstance("周迎川",21);
System.out.println(person);
//3
Method add_method = cls.getMethod("add");
Caculator cc =new Caculator(4,5);
add_method.invoke(c);
}
}