2009年5月5日 星期二

用JUnit測試protected程式碼

今天稍為練習了一下JUnit,他是個開放源碼的測試框架
主要是配合Refactoring跟TDD(測試驅動)、XP(極限編程)等
單元測試可以測試程式碼,有人主張每個class都該有自己的測試碼

官網:http://www.junit.org/

今天會想做這個測試,是因為在看Refactoring的時候意外發現Java的protected修飾子
可以讓member依然在非同個繼承體系下使用


public class TestProtect extends TestCase {

public TestProtect(String test){
super(test);
}
public void testProtect() {
Parent parent=new Parent();
Children child=parent.createChildren();
assertNotNull("OK", child);
}
public static void main(String[] args) {
junit.textui.TestRunner.run(TestProtect.class);
}
}
class Parent {
public Parent() {

}
public Children createChildren(){
return new Children();
}
}
class Children extends Parent {
protected Children() {

}
protected String say() {
return "I am Children";
}
}


使用JUnit得時候要讓想測試的class去繼承Testcase
然後必須有兩個主要的東西要寫:testMethod跟帶一個String參數的建構子 TestProtect(String test)
並且他們都必須是public,這樣Testcase才能運作

至於那段

public static void main(String[] args) {
junit.textui.TestRunner.run(TestProtect.class);
}



是可以可選的,只是為了讓測試更有彈性的一段程程式,就算拿掉也是可以RUN
Testcase會去尋找以test開頭的函式,像是testProtect來做測試
測試程式碼是自己餵一些資料然後看程式是否正常運作

順便附上JUnit跑的畫面,人家常常在說軟體的綠棒紅棒還是綠燈紅燈的
就是測試的通過



第一張圖片,我有兩個測試的testMethod,主要測試物件是否為null是否話就會RUN不過變成紅棒
我的testProtect2因為是放個null所以run不過,並且他幫我清楚標出是哪個測試函式沒過試驗



第二張圖片,由於我把testProtect2改成一個有instance的object所以他變成綠棒

這邊只是個簡單的實驗,,並沒有真的做什麼測試


參考資料:JUnit學習筆記



之前所學的protected主要是讓自己的subclass可以叫用superclass的member,但是java很特殊,以protected修飾的member,就算不是同一個繼承體系,同個package之下的其他class仍然可以使用他。

這點不若C++還是C#等語言的嚴謹,必須一定得subclass才能使用

下面附上java的 access level table






































Access Levels
ModifierClassPackageSubclassWorld
publicYYYY
rotectedYYYN
no modifierYYNN
privateYNNN


參考資料:http://java.sun.com/docs/books/tutorial/java/javaOO/accesscontrol.html

沒有留言: