1. 程式人生 > >Java學習筆記11-- Junit單元測試 ;BeanUtils ;檔案路徑

Java學習筆記11-- Junit單元測試 ;BeanUtils ;檔案路徑

∆ Junit單元測試

1.1. Junit單元測試框架的基本使用

一、搭建環境:
匯入junit.jar包(junit4)

二、寫測試類:
0,一般一個類對應一個測試類。
1,測試類與被測試類最好是放到同一個包中(可以是不同的原始檔夾)
2,測試類的名字為被測試類的名字加Test字尾。

三:寫測試方法:
0,一般一個方法對應一個單元測試方法。
1,測試方法的名字為test字首加被測試方法的名字,如testAddPerson()。
2,單元測試方法上面要加上@Test註解(org.junit.Test)!
3,單元測試方法不能有引數,也不能有返回值(返回void)!測試的方法不能是靜態的方法。

四、測試方法的基本使用:


1,可以單獨執行一個測試方法,也可以一次執行所有的、一個包的、一個類中所有的測試方法。
2,執行完後,顯示綠色表示測試成功;顯示紅色表示測試失敗(拋異常後會測試失敗)。

五、程式碼展示:

public class Demo1 {
	
	@Test //註解
	public	 void getMax(int a, int b){
	/*	int a = 3;
		int b = 5 ;*/
		int max = a>b?a:b;
		System.out.println("最大值:"+max);
	}

	
	@Test
	public void sort(){
		int[] arr = {12,4,1,19};
		for(int i = 0 ; i  < arr.length-1 ; i++){
			for(int j = i+1 ; j<arr.length ; j++){
				if(arr[i]>arr[j]){
					int temp = arr[i];
					arr[i] = arr[j];
					arr[j] = temp;
				}
			}
		}
		System.out.println("陣列的元素:"+Arrays.toString(arr));
	}
}

1.2. Assert斷言工具類

一、其中有一些靜態的工具方法(不符合期望就拋異常):

	assertTrue(...)		引數的值應是true
	assertFalse(...)	引數的值應是false  

	assertNull(...)		應是null值
	assertNotNull(...)	應是非null的值
	
	assertSame(...)		使用==比較的結果為true(表示同一個物件)
	AssertNotSame(...)	使用==比較的結果為false

	assertEquals(...)	兩個物件equals()方法比較結果為true
	assertEquals(...)	兩個物件equals()方法比較結果為true

二、程式碼展示:

//測試類
public class ToolTest {
	@Test
	public void testGetMax(){
		int max = Tool.getMax();
		if(max!=5){
			throw new RuntimeException();
		}else{
			System.out.println("最大值:"+ max);
		}
		//斷言
		//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);
	}
	@Test
	public void  testGetMin(){
		int min = Tool.getMin(); 
		if(min!=3){
			throw new RuntimeException();
		}else{
			System.out.println("最小值:"+ min);
		}
	}
}

1.3. 用於準備環境、清理環境的方法

@Test
表示單元測試方法。

@Before
所修飾的方法應是非static的(且沒有引數,返回值為void)。
表示這個方法會在本類中的每個單元測試方法之前都執行一次。

@After
所修飾的方法應是非static的(且沒有引數,返回值為void)。
表示這個方法會在本類中的每個單元測試方法之後都執行一次。

@BeforeClass
所修飾的方法應是static的(且沒有引數,返回值為void)。
表示這個方法會在本類中的所有單元測試方法之前執行,只執行一次。

@AfterClass
所修飾的方法應是static的(且沒有引數,返回值為void)。
表示這個方法會在本類中的所有單元測試方法之後執行,只執行一次。

程式碼展示:

public class Demo2 {
	//準備測試的環境
	//@Before
	@BeforeClass
	public static void beforeRead(){
		System.out.println("準備測試環境成功...");
	}
	//讀取檔案資料,把把檔案資料都
	@Test
	public void readFile() throws IOException{
		FileInputStream fileInputStream = new FileInputStream("F:\\a.txt");
		int content  = fileInputStream.read();
		System.out.println("內容:"+content);
	}
	@Test
	public void sort(){
		System.out.println("讀取檔案資料排序..");
	}
	//清理測試環境的方法
//	@After 
	@AfterClass
	public static void afterRead(){
		System.out.println("清理測試環境..");
	}
}

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

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

BeanUtilss使用的步驟:

  1. 導包commons-logging.jar 、 commons-beanutils-1.8.0.jar
  2. 程式碼。

程式碼展示

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);

		Emp  e = new Emp();
		BeanUtils.setProperty(e, "id", id);
		BeanUtils.setProperty(e, "name",name);
		BeanUtils.setProperty(e, "salary",salary);
		BeanUtils.setProperty(e, "birthday",birthday);
		
		System.out.println(e);
	}
}

Emp.java

import java.util.Date;

public class Emp {
		
	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 Emp(int id, String name, double salary) {
		super();
		this.id = id;
		this.name = name;
		this.salary = salary;
	}
	public Emp(){}
	@Override
	public String toString() {
		return "編號:"+this.id+" 姓名:"+ this.name+ " 薪水:"+ this.salary+" 生日:"+ birthday;
	}

}

∆ 檔案路徑

1.1. 絕對路徑

以根目錄或某碟符開頭的路徑(或者說完整的路徑)
例如:

  • c:/a.txt (Windows作業系統中)
  • c:/xxx/a.txt (Windows作業系統中)
  • /var/xx/aa.txt (Linux作業系統中)

絕對路徑的問題: 比如C:\abc\a.properties檔案路徑,該路徑在windows上執行沒有 問題,但是如果把該專案移動到linux上面執行 ,該路徑就會出現問題了,因為在linux上面沒有c盤的,只有根目錄\。

1.2. 相對路徑

相對於當前路徑的一個路徑。例如當前資料夾為c:/abc時:相對路徑a.txt表示c:/abc/a.txt,相對路徑xx/a.txt = c:/abc/xx/a.txt

 .  表示當前資料夾
 .. 表示上級資料夾	

相對路徑存在的問題:相對路徑是相對於目前執行class檔案的時候,控制檯所在的路徑,這樣子也會導致出現問題。

1.3. Java程式中的相對路徑

在Java程式中使用File時寫相對路徑,是指相對於執行java命令時當前所在的資料夾。

測試程式碼:

在這裡插入圖片描述
在命令列中使用cd命令切換到不同的路徑下試試,可以看到以上所說的效果。

在Eclipse中,當前路徑是工程的根目錄。

1.4. classpath路徑

1.4.1. classpath路徑說明
在Java程式中,一般情況下使用絕對路徑還是相對路徑都不太合適,因為Java程式的jar包所放的位置不確定,執行java程式時當前的路徑也不確定,所以不合適。一般在Java程式中我們會把資源放到classpath中,然後使用classpath路徑查詢資源。

Classpath路徑:就是使用classpath目前的路徑。

1.4.2. 獲取classpath中的資源(InputStream)

在這裡插入圖片描述

程式碼解釋

 如果經常會發生變化的資料我們可以定義在配置檔案上。 比如說:資料庫的使用者名稱與密碼。
  
 配置檔案的路徑應該如何寫 呢?
 	
 	絕對路徑:一個檔案的完整路徑資訊。一般絕對路徑是包含有碟符 的。  絕對路徑的缺陷: 因為絕對路徑是有碟符開頭的,有些系統是沒有碟符的。
 	
 	相對路徑: 相對路徑是相對於當前程式的路徑。當前路徑就是執行java命令的時候,控制檯所在的路徑。
 	
 	類檔案路徑 :類檔案路徑就是使用了classpath的路徑找對應的資原始檔。
 	
 	如果需要使用到類檔案路徑首先先要獲取到一個Class物件。
 	
 
 
 */
public class DBUtil {
	static Properties properties ;
	static{
		try {
			properties = new Properties();
			//去載入配置檔案  /
			Class clazz = DBUtil.class; 
			InputStream inputStream = clazz.getResourceAsStream("/db.properties"); //  "/"代表了Classpath的路徑。           getResourceAsStream 該方法裡面使用的路徑就是使用了類檔案路徑。
			properties.load(inputStream);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	public static void main(String[] args) {
		System.out.println("當前路徑:"+ new File(".").getAbsolutePath() );
		System.out.println("使用者名稱:"+ properties.getProperty("userName")+" 密碼:"+properties.getProperty("password"));	
	}
}