Junit测试方法,可以替代main方法执行测试代码。
如何定义测试方法:
1)不能有返回值,应该是void
2)测试方法需要空参
3)权限需要public
对于Junit的测试方法强制要求格式:公共的,无参,无返回值的方法
@Test
public void 方法名(){
测试逻辑
}
public class Demo01{
publicstaticvoidmain(String[]args) {
System.out.println("Hello World");
newDemo01().show();
}
@Test
public void show() {
//System.out.println(1/0);
System.out.println("Hello Show ");
}
// @Test
// public int getNum(){ //无效的测试方法
// return 100;
// }
//@Test
//public void showNum(int num) {//Method showNum should have no parameters
// System.out.println(num);
//}
//@Test
//private void showTest(){ //Method showTest() should be public
// System.out.println();
//}
}
2Junit测试其它常用注解
1.@Test,用于修饰需要执行的方法
2.@Before,测试方法倩执行的方法
3@After,测试方法后执行的方法
运行时,还可以右键运行测试方法的类,该类中所以@Test注解的方法都会执行一遍。
3写Junit测试方法时,要注意的事情
==这个方法要求一定要是 无参无返回值的公共非静态方法==
4反射:Class的理解
Class类型是用来描述java中已存在的或者是程序自己定义的类型
所有的类型,包括基本数据类型都有自己的Class对象
反射的操作其实就是去剖析这个Class对象,以得其构造方法,属性,方法。
5如何获取Class对象【反射技术的基础】
//获取User类型的字节码对象【Class 对象】
@Test
public void getClassObj() throws ClassNotFoundException {
//1:借助全类名,使用Class.forName(全类名) : 全类名就是包含包名的类名
//User全类名:com.itheima.demo02reflect.User
Class<?> cls1 = Class.forName("com.itheima.demo02reflect.User");
//2:类名.class
Class<User> cls2 = User.class;
//3):通过对象
Class<? extends User> cls3 = new User().getClass();
System.out.println(cls1==cls2); //true
System.out.println(cls1==cls3); //true
}
@Test
public void getBasicTypeClass(){
//基本数据类型的Class对象,可以直接使用 类型.class
System.out.println(int.class);
System.out.println(boolean.class);
System.out.println(void.class);
}
6获取类名信息及使用Class对象创建对象
1. String getSimpleName(); 获得简单类名,只是类名,没有包
2. String getName(); 获取完整类名,包含包名+类名
3. T newInstance() ;创建此 Class 对象所表示的类的一个新实例。要求:类必须有public的无参数构造方法
*/
@Test
public void test() throws IllegalAccessException, InstantiationException {
Class<User> cls = User.class;
//将User类的类名获取
//1. String getSimpleName(); 获得简单类名,只是类名,没有包
System.out.println("cls.getSimpleName() = " + cls.getSimpleName());
//2. String getName(); 获取完整类名,包含包名+类名
System.out.println("cls.getName() = " + cls.getName());
//利用Class对象创建该类型 的对象。
//3. T newInstance() ;创建此 Class 对象所表示的类的一个新实例。要求:类必须有public的无参数构造方法
User user = cls.newInstance();
System.out.println("user = " + user);
}
}
7构造方法的获取和使用
/*
如果获取类中的构造方法:借助Class中的以下方法
1. Constructor[] getConstructors()
获取所有的public修饰的构造方法
2. Constructor getConstructor(Class... parameterTypes)
根据参数类型获取构造方法对象,只能获得public修饰的构造方法。如果不存在对应的构造方法,则会抛出 java.lang.NoSuchMethodException 异常。
Constructor构造器类中常用的方法
1. T new Instance(Object... initargs) 根据指定参数创建对象。
2. T new Instance() 空参构造方法创建对象。
*/
publicclassDemo03Constructor{
//获取User Class对象
publicClassgetUserClass() {
returnUser.class;
}
@Test
publicvoidgetAllConstructor() {
Classcls=getUserClass();
//Constructor[] getConstructors(): 可以获取一个类中的所有构造方法
Constructor[]cons=cls.getConstructors();
for(Constructorcon:cons) {
System.out.println("con = "+con);
}
}
@Test
publicvoidgetSpecialConstructor()throwsNoSuchMethodException{
// 2. Constructor getConstructor(Class... parameterTypes)
Classcls=getUserClass();// User Class 对象
Constructorcon1=cls.getConstructor();// 无参
System.out.println("con1 = "+con1);
//获取User 中的满参构造方法
Constructorcon2=cls.getConstructor(int.class,String.class,int.class);
System.out.println("con2 = "+con2);
}
//根据获取User的构造器,去创建对象
@Test
publicvoidtestCreateUserObj()throwsNoSuchMethodException,IllegalAccessException,InvocationTargetException,InstantiationException{
//以前
Useruser1=newUser(18,"蔡徐坤",200);
System.out.println("user1 = "+user1);
//反射的技术创建对象
//1)获取Class对象
//2)获取Class对象中的构造方法对象
//3)通过构造方法去调用 newInstance(参数)
Classcls=getUserClass();
//空参
Constructorcon1=cls.getConstructor();
Objectuser2=con1.newInstance();//创建对象
System.out.println("user2 = "+user2);
//满参构造
Constructorcon2=cls.getConstructor(int.class,String.class,int.class);
Objectuser3=con2.newInstance(20,"王伯群",150);
System.out.println("user3 = "+user3);
}
}
8.方法(Method)对象的获取和使用
/*
1)获取类型的Class对象
2)获取Class对象中的方法对象【Method对象】
1. Method[] getMethods() 获取所有的public修饰的成员方法,包括父类中
2. Method[] getDeclaredMethods() 获取【当前类中所有的方法】,包含私有的,不包括父类中
3. Method getMethod("方法名", 方法的参数类型... 类型) 根据方法名和参数类型获得一个方法对象,只能是获取public修饰的
4. Method getDeclaredMethod("方法名", 方法的参数类型... 类型) 根据方法名和参数类型获得一个方法对象,包括private修饰的
注意:如果要获取本类中的非public方法,就需要使用含有Declared的方法获取
3)把方法调用起来
1. Object invoke(Object obj, Object... args)
根据参数args调用对象obj的该成员方法
如果obj=null,则表示该方法是静态方法
2. void setAccessible(true) 暴力反射,设置为可以直接调用私有修饰的成员方法【对于私有方法使用前需要调用该方法】
*/
9属性(Filed)对象的获取和使用
1)获取类对应的Class对象
2)获取Class对象中的属性对象:Filed对象
1. Field[] getFields() 获取所有的包括父类中public修饰的属性对象,返回数组
2. Field[] getDeclaredFields() 获取所有本类属性对象,包括private修饰的,返回数组
3. Field getField(String name) 根据属性名获得属性对象,只能获取public修饰的
4. Field getDeclaredField(String name) 根据属性名获得属性对象,包括private修饰的
3)可以去访问设置,获取Filed对象的值
1. Object get(Object obj) 返回指定对象上此 Field 表示的字段的值。
2. void set(Object obj, Object value) 将指定对象变量上此 Field 对象表示的字段设置为指定的新值。
3. void setAccessible(true); 暴力反射,设置为可以直接访问私有类型的属性