Junit、Assert、內省、Properties類與配置檔案的使用

fan_rockrock發表於2016-11-14

Junit

Junit有什麼用

可以不寫main方法直接對方法進行測試

怎麼使用

1、匯入junit.jar包
2、加入@Test註釋
3、例子如下

import org.junit.Test;
public class Demo1 {
    @Test
    public void fun(){
        System.out.println("Junit測試");
    }
}

使用規範

  1. 一個類如果需要測試,那麼該類就應該對應著一個測試類,測試類的命名規範 : 被測試類的類名+ Test.
  2. 一個被測試的方法一般對應著一個測試的方法,測試的方法的命名規範是: test+ 被測試的方法的方法名
    例子如下:
//實際類
public class Tool 
    public static int getMax(){
        int a = 3;
        int b  =5; 
        int max = a>b?a:b;
        return max;
    }

    public static int getMin(){
        int a = 3;
        int b = 5; 
        int min = a<b?a:b;
        return min;
    }
}
import org.junit.Test;

//測試類
public class ToolTest {

    @Test
    public void testGetMax(){
        int max = Tool.getMax();
        if(max!=5){
            throw new RuntimeException();
        }else{
            System.out.println("最大值:"+ max);
        }
    }
    @Test
    public void  testGetMin(){
        int min = Tool.getMin(); 
        if(min!=3){
            throw new RuntimeException();
        }else{
            System.out.println("最小值:"+ min);
        }
    }
}

使用注意點

  1. 如果使用junit測試一個方法的時候,在junit視窗上顯示綠條那麼代表測試正確,如果是出現了紅條,則代表該方法測試出現了異常不通過。
  2. 如果點選方法名、 類名、包名、 工程名執行junit分別測試的是對應的方法,類、 包中 的所有類的test方法,工程中的所有test方法。
  3. @Test測試的方法不能是static修飾與不能帶有形參。
  4. 如果測試一個方法的時候需要準備測試的環境或者是清理測試的環境,那麼可以@Before、 @After 、@BeforeClass、 @AfterClass這四個註解。
    @Before、 @After 是在每個測試方法測試的時候都會呼叫一次,
    @BeforeClass、 @AfterClass是在所有的測試方法測試之前與測試之後呼叫一次而已。
    案例如下:
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;

public class Demo2 {
    //@Before
    @BeforeClass
    public static void before(){
        System.out.println("方法呼叫前...");
    }
    @Test
    public void fun1() {
        System.out.println("我是方法一");
    }
    @Test
    public void fun2(){
        System.out.println("我是方法二");
    }
    //@After 
    @AfterClass
    public static void after(){
        System.out.println("方法呼叫後..");
    }
}

執行如下:

方法呼叫前...
我是方法二
我是方法一
方法呼叫後..

使用@Before和@After同時去掉static效果如下:

方法呼叫前...
我是方法二
方法呼叫後..
方法呼叫前...
我是方法一
方法呼叫後..

Assert

Assert有什麼用

可以直接使用Assert提供的方法來判斷對錯,由Junit執行紅藍來判斷
Assert有以下幾種方法

import junit.framework.Assert;

import org.junit.Test;

//測試類
public class ToolTest { 
@Test
public void testGetMax(){
  Assert.assertSame(5,5);
  //Assert.assertSame(5, max); // expected 期望   actual  真實     
  //Assert.assertSame(new String("abc"), "abc");
  //Assert.assertEquals(new String("abc"), "abc"); //底層是使用Equals方法比較的
  //Assert.assertNull("aa");
  //Assert.assertTrue(true);
}

內省

JavaBean

 JavaBean是一種特殊的類,主要用於傳遞資料資訊,這種類中的方法主要用於訪問私有的欄位,且方法名符合一定規則。
一個JavaBean需要滿足以下條件:
1)必須有無參建構函式
2)屬性必須私有, 我們稱為欄位
3)提供標準的getter和setter

//快捷鍵是shift+alt+s
public class User
{
    private String name;
    private int age;
    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;
    }
    @Override
    //為了方便列印,新增一個toString方法
    public String toString()
    {
        return "User [age=" + age + ", name=" + name + "]";
    }
}

內省是什麼

通過反射的方式訪問javabean的技術

內省有什麼用

可以實現一種通用性
1、傳統的方式訪問JavaBean

public class Demo1
{
    public static void main(String[] args)
    {
        User user=new User();

        user.setName("zhangsan");
        user.setAge(19);
        System.out.println(user);
    }

}

2、使用內省的方式來訪問javabean
PropertyDescriptor類操作Bean的屬性

public class Demo1
{
    public static void main(String[] args) throws Exception
    {
        User user=new User();
        //建立屬性描述器
        PropertyDescriptor descriptor=new PropertyDescriptor("name",User.class);
        //獲得寫方法
        Method writeMethod=descriptor.getWriteMethod();

        //呼叫寫方法
        writeMethod.invoke(user, "lisi");
        System.out.println(user);

    }

}

3.簡化書寫,實現通用性。

import java.beans.IntrospectionException;
import java.beans.PropertyDescriptor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import cn.itcast.day08.domain.User;

public class Demo2 {

    /**
     * @param args
     * @throws IntrospectionException 
     * @throws InvocationTargetException 
     * @throws IllegalAccessException 
     * @throws IllegalArgumentException 
     */
    public static void main(String[] args) throws Exception {
        // 內省

        User user = new User();

        setProperty(user, "name", "wangwu");
        setProperty(user, "age", 11);//若為"11"的話就會出現型別錯誤     
        System.out.println(user);

    }

    // 實現一個通用的方法   為任意的一個javabean的任意屬性賦任意值
    public static void setProperty(Object bean, String fieldName, Object value) throws Exception {
        // 建立屬性描述器
        PropertyDescriptor descriptor = new PropertyDescriptor(fieldName, bean.getClass());
        // 獲得 寫方法
        Method writeMethod = descriptor.getWriteMethod();
        // 呼叫 寫方法
        writeMethod.invoke(bean, value);
    }

}

BeanUtils

由於內省用起來特別麻煩,Apache組織開發了一套用於操作JavaBean的API BeanUtils,如下詳講:
(1)可以支援String到8中基本資料型別轉換
(2)其他引用資料型別都需要註冊轉換器 ConvertUtils.register(Converter, Class)

如何使用

需匯入兩個jar包:commons-beanutils-1.8.0.jar、commons-logging.jar
案例如下 :

import java.util.Date;

public class User {

    private  int id;

    private String name;

    private double salary;

    private Date birthday;


    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getSalary() {
        return salary;
    }

    public void setSalary(double salary) {
        this.salary = salary;
    }

    public User(int id, String name, double salary) {
        super();
        this.id = id;
        this.name = name;
        this.salary = salary;
    }

    public User(){}

    @Override
    public String toString() {
        return "編號:"+this.id+" 姓名:"+ this.name+ " 薪水:"+ this.salary+" 生日:"+ birthday;
    }

}
import java.text.SimpleDateFormat;
import java.util.Date;

import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.ConvertUtils;
import org.apache.commons.beanutils.Converter;

/*
 BeanUtils:

 BeanUtils主要解決 的問題: 把物件的屬性資料封裝 到物件中。

 BeanUtils的好處:
    1. BeanUtils設定屬性值的時候,如果屬性是基本資料 型別,BeanUtils會自動幫我轉換資料型別。
    2. BeanUtils設定屬性值的時候底層也是依賴於get或者Set方法設定以及獲取屬性值的。
    3. BeanUtils設定屬性值,如果設定的屬性是其他的引用 型別資料,那麼這時候必須要註冊一個型別轉換器。

 BeanUtilss使用的步驟:
    1. 導包commons-logging.jar 、 commons-beanutils-1.8.0.jar

 */
public class Demo3 {
    public static void main(String[] args) throws Exception {
        //從檔案中讀取到的資料都是字串的資料,或者是表單提交的資料獲取到的時候也是字串的資料。
        String id ="110";
        String name="陳其";
        String salary = "1000.0";
        String birthday = "2013-12-10";

        //使用匿名內部內註冊一個型別轉換器
        ConvertUtils.register(new Converter() {
            @Override
            public Object convert(Class type, Object value) { // type : 目前所遇到的資料型別。  value :目前引數的值。
                Date date = null;
                try{
                    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
                    date = dateFormat.parse((String)value);
                }catch(Exception e){
                    e.printStackTrace();
                }
                return date;
            }

        }, Date.class);

        User  e = new User();
        BeanUtils.setProperty(e, "id", id);
        BeanUtils.setProperty(e, "name",name);
        BeanUtils.setProperty(e, "salary",salary);
        BeanUtils.setProperty(e, "birthday",birthday);

        System.out.println(e);
    }
}

Properties類與配置檔案

java.util.Properties類和.properties檔案的使用

相關文章