本节思维导图
JUnit学习
JUnit学习
JUnit是一个Java语言的单元测试框架。
JUnit是用于编写和运行可重复的自动化测试的开源测试框架。
可在官网下载junit jar包。
JUnit的特点
-JUnit是用于编写和运行测试的开源框架。
-提供了注释,以确定测试方法。
-提供断言测试预期结果。
-提供了测试运行的运行测试。
-JUnit测试让您可以更快地编写代码,提高质量
-JUnit是优雅简洁。它是不那么复杂以及不需要花费太多的时间。
-JUnit测试可以自动运行,检查自己的结果,并提供即时反馈。没有必要通过测试结果报告来手动梳理。
-JUnit测试可以组织成测试套件包含测试案例,甚至其他测试套件。
-Junit显示测试进度的,如果测试是没有问题条形是绿色的,测试失败则会变成红色
junit简单示例
要先导入junit的jar包。
我们先创建一个TestJunit类
public class TestJunit {
public void add(int a,int b)
{
System.out.println(a+b);
}
}
这个类里有一个add方法,传入两个值,打印相加的结果。
我们在测试类里来测试这个方法。
public class TestAdd {
@Test
public void add()
{
TestJunit testJunit=new TestJunit();
testJunit.add(2, 3);
}
}
在测试类中直接选择方法名Run as在junit中,就可以运行。
条形是绿色的,说明通过测试,add方法没问题。
Java 注解(Annotation),也叫元数据。
一种代码级别的说明。它是JDK1.5及以后版本引入的一个特性,与类、接口、枚举是在同一个层次。
它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释。
Junit注解
例子:
public class TestAdd {
@Before
public void before()
{
System.out.println("Before....");
}
@Test
public void add()
{
TestJunit testJunit=new TestJunit();
testJunit.add(2, 3);
}
@After
public void after()
{
System.out.println("after...");
}
}
结果为
Before...
5
after...
断言:
断言表示为一些布尔表达式,程序员相信在程序中的某个特定点该表达式值为真,可以在任何时候启用和禁用断言验证,因此可以在测试时启用断言而在部署时禁用断言。
JUnit断言
例子:
public class Test {
@Test
public void test()
{
String obj1 = "junit";
String obj2 = "junit";
String obj3 = "test";
String obj4 = "test";
String obj5 = null;
int var1 = 1;
int var2 = 2;
int[] arithmetic1 = { 1, 2, 3 };
int[] arithmetic2 = { 1, 2, 3 };
assertEquals(obj1, obj2);
assertSame(obj3, obj4);
assertNotSame(obj2, obj4);
assertNotNull(obj1);
assertNull(obj5);
assertArrayEquals(arithmetic1, arithmetic2);
}
}
java反射机制
java反射机制简介
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;
这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
JAVA反射机制功能
-在运行时判断任意一个对象所属的类;
-在运行时构造任意一个类的对象;
-在运行时判断任意一个类所具有的成员变量和方法;
-在运行时调用任意一个对象的方法;
-生成动态代理。
反射原理
**我们写好的java文件被编译为.class文件,通过jvm把class文件加载到内存中
class文件在内存中其实也被当成类表示,我们就可以通过一些方法获得这个类里面的信息。
**使用反射的时候,首先需要获取到class类,得到了这个类以后
就可以得到class文件里面所有的信息
-包括属性,构造方法,普通方法。
得到class类的三种常用方法
*类名.class
*对象.getClass()
*使用Class.forName(“类名”);
**属性通过Filed类获取
**构造方法通过Constructor类获取
**普通方法通过Method类获取
反射机制实战
Person类
public class Person {
private String name;
private String id;
//无参数的构造方法
Person()
{
}
//有参数的构造方法
public Person(String name,String id)
{
this.name=name;
this.id=id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
}
使用反射机制操作构造方法
//操作无参数的构造方法
TestDemo类
public class TestDemo {
public static void main(String[] args) throws Exception {
//先获取class类
Class c=Class.forName("cn.cad.test.Person");
//获取实例,原理就是调用无参数的构造方法
Person p=(Person) c.newInstance();
//设置名字
p.setName("张三");
System.out.println(p.getName());
}
}
//操作有参数的构造方法
public static void main(String[] args) throws Exception {
//获取class类
Class c=Class.forName("cn.cad.test.Person");
//获取有参数构造方法,里面传递有参数构造方法里面的数据类型,类型使用class形式传递,getConstructors()方法是获取所有的构造方法
Constructor cs= c.getConstructor(String.class,String.class);
//获得实例,原理是调用有参数的构造方法
Person p=(Person)cs.newInstance("李四","002");
System.out.println(p.getName()+"--"+p.getId());
}
使用反射机制操作属性
public static void main(String[] args) throws Exception {
//获取class类
Class c=Class.forName("cn.cad.test.Person");
//创建一个实例
Person p=(Person)c.newInstance();
//通过名字获取属性
Field name=c.getDeclaredField("name");
//设置可以操作private属性,不设置操作private属性的话就会出现异常
name.setAccessible(true);
//设置值
name.set(p, "王五");
//打印
System.out.println(name.get(p));
}
使用反射机制操作普通方法
public class TestDemo {
public static void main(String[] args) throws Exception {
// 获取class类
Class c=Class.forName("cn.cad.test.Person");
//获取实例
Person p=(Person) c.newInstance();
//获取方法并且指定方法参数的数据类型
Method m=c.getDeclaredMethod("setName", String.class);
//执行方法并传递实例和值
m.invoke(p, "赵六");
System.out.println(p.getName());
}
}
如果操作私有方法时,可以 m.setAccessible(true);来设置
如果操作的是静态方法,则不需要传实例,m.invoke(null,"赵六");