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使用的步驟:
- 導包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);
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"));
}
}