摘要 不能因?yàn)镴ava Micro Edition缺乏反射能力就說(shuō)Java Micro Edition開(kāi)發(fā)者無(wú)法利用JUnit風(fēng)格測(cè)試的優(yōu)點(diǎn)。其實(shí),借助于具有JUnit風(fēng)格的其它一些框架和工具,Java ME開(kāi)發(fā)人員仍然能夠改進(jìn)Java ME應(yīng)用程序的開(kāi)發(fā)質(zhì)量。本系列文章(兩篇)正是想詳細(xì)探討J2MEUnit和JMUnit這兩個(gè)開(kāi)源框架在Java ME單元測(cè)試開(kāi)發(fā)中的應(yīng)用。
一、 引言
如今,JUnit測(cè)試正在逐漸成為大多數(shù)Java標(biāo)準(zhǔn)版(SE)和企業(yè)版(EE)應(yīng)用程序開(kāi)發(fā)中的基本組成部分-對(duì)于那些積極擁護(hù)測(cè)試驅(qū)動(dòng)開(kāi)發(fā)者尤其如此。Kent Beck和Eric Gamma的最初的Smalltalk框架變得如此流行和成功,以至于它被移植到很多編程語(yǔ)言中,包括Ada(AUnit)、C#(NUnit)、Python(PyUnit),甚至還有Fortran(fUnit)。實(shí)踐證明,Java的JUnit是所有的單元測(cè)試框架中最成功的并且已經(jīng)派生出許多JUnit"變種"(以各種"擴(kuò)展"的形式),這些框架最終幫助在從多線(xiàn)程Java應(yīng)用程序到高級(jí)企業(yè)Java應(yīng)用程序的主流開(kāi)發(fā)中實(shí)現(xiàn)單元測(cè)試。
然而,使用JUnit或找到一種JUnit擴(kuò)展用于Java Micro Edition開(kāi)發(fā)一直以來(lái)卻是很難的事情。須知,JUnit框架依賴(lài)于Java反射API。由于Java ME環(huán)境中還不支持反射API,所以,典型的很大程度上依賴(lài)于反射的JUnit工具還不能幫助進(jìn)行Java ME開(kāi)發(fā)。盡管如此,已經(jīng)出現(xiàn)兩個(gè)專(zhuān)門(mén)針對(duì)設(shè)備應(yīng)用程序開(kāi)發(fā)者構(gòu)建的Java ME JUnit擴(kuò)展。值得注意的是,隨著NetBeans和NetBeans Mobility 5.5的發(fā)行,NetBeans和NetBeans Mobility Pack正在計(jì)劃合并一個(gè)Java ME JUnit風(fēng)格的框架。這種新版本的IDE將以一種更為利索的方式在你的Java ME應(yīng)用程序中加入單元測(cè)試。
本文將通過(guò)使用Java ME JUnit框架向你介紹JUnit測(cè)試;通過(guò)本文,你會(huì)發(fā)現(xiàn),如何獲取這些工具,如何使用它們進(jìn)行測(cè)試以及如何使用它們來(lái)構(gòu)建質(zhì)量更好的軟件。
二、 獲取Java ME單元測(cè)試框架
如今,市場(chǎng)上存在兩個(gè)可用的JavaME JUnit測(cè)試框架,它們是J2MEUnit和JMUnit。這兩個(gè)工程都是可自由下載的開(kāi)源框架,你可以從SourceForge.net上下載一個(gè)打包文件。
然而,這兩個(gè)開(kāi)源工程的工程主管(Elmar Sonnenschein和Brunno Silva,分別維護(hù)J2MEUnit和JMUnit),正在計(jì)劃把這兩個(gè)框架合并為一個(gè)。新的工程將在J2MEUnit工程基礎(chǔ)上得到進(jìn)一步鞏固。根據(jù)Sonnenschein本人的說(shuō)法,"因?yàn)楦嗟默F(xiàn)有用戶(hù)的工程都是基于SourceForge上的J2MEUnit框架;所以,我們計(jì)劃基于Brunno的JMUnit 2.0創(chuàng)建一個(gè)J2MEUnit 2.0發(fā)行版本。"Silva在一次最近的新聞發(fā)布會(huì)上聲稱(chēng)在今年年底可能無(wú)法完成產(chǎn)品的合并和一個(gè)2.0版本的發(fā)行。Silva進(jìn)一步建議說(shuō),新的工程"不想破壞這兩個(gè)框架的當(dāng)前用戶(hù)的原有代碼,因此,原始代碼會(huì)繼續(xù)存在,只是不再建議使用。新的單元框架應(yīng)該展現(xiàn)出兩個(gè)框架-JMUnit和J2MEUnit-各自的特色。"
三、 一個(gè)簡(jiǎn)單的示例應(yīng)用程序
在分析各種單元測(cè)試框架之前,你需要一些簡(jiǎn)單的代碼以備測(cè)試之用。在這個(gè)例子中,下面這個(gè)簡(jiǎn)單的Conversion類(lèi)能夠用于創(chuàng)建并測(cè)試Java ME單元測(cè)試。
public class DistanceConversion {
public static int feetToMeters(int ft){
return (ft * 3048)/10000;
}
public static int metersToFeet(int meters){
return (meters*3281)/1000;
}
public static int milesToKM(int miles){
return (miles*1609)/1000;
}
public static int kmToMiles(int km){
return (km*6214)/10000;
}
}
public class TemperatureConversion {
public static float fahrenheitToCelsius (float degrees){
return ((degrees-32)/9)*5;
}
public static float celsiusToFahrenheit (float degrees){
return ((degrees * 9)/5)+32;
}
public static boolean isHotter (float degFaren, float degCel){
return ((fahrenheitToCelsius(degFaren))-degCel) > 0;
}
public static boolean isCooler (float degFaren, float degCel){
return ((fahrenheitToCelsius(degFaren))-degCel) < 0;
}
}
一、 引言
如今,JUnit測(cè)試正在逐漸成為大多數(shù)Java標(biāo)準(zhǔn)版(SE)和企業(yè)版(EE)應(yīng)用程序開(kāi)發(fā)中的基本組成部分-對(duì)于那些積極擁護(hù)測(cè)試驅(qū)動(dòng)開(kāi)發(fā)者尤其如此。Kent Beck和Eric Gamma的最初的Smalltalk框架變得如此流行和成功,以至于它被移植到很多編程語(yǔ)言中,包括Ada(AUnit)、C#(NUnit)、Python(PyUnit),甚至還有Fortran(fUnit)。實(shí)踐證明,Java的JUnit是所有的單元測(cè)試框架中最成功的并且已經(jīng)派生出許多JUnit"變種"(以各種"擴(kuò)展"的形式),這些框架最終幫助在從多線(xiàn)程Java應(yīng)用程序到高級(jí)企業(yè)Java應(yīng)用程序的主流開(kāi)發(fā)中實(shí)現(xiàn)單元測(cè)試。
然而,使用JUnit或找到一種JUnit擴(kuò)展用于Java Micro Edition開(kāi)發(fā)一直以來(lái)卻是很難的事情。須知,JUnit框架依賴(lài)于Java反射API。由于Java ME環(huán)境中還不支持反射API,所以,典型的很大程度上依賴(lài)于反射的JUnit工具還不能幫助進(jìn)行Java ME開(kāi)發(fā)。盡管如此,已經(jīng)出現(xiàn)兩個(gè)專(zhuān)門(mén)針對(duì)設(shè)備應(yīng)用程序開(kāi)發(fā)者構(gòu)建的Java ME JUnit擴(kuò)展。值得注意的是,隨著NetBeans和NetBeans Mobility 5.5的發(fā)行,NetBeans和NetBeans Mobility Pack正在計(jì)劃合并一個(gè)Java ME JUnit風(fēng)格的框架。這種新版本的IDE將以一種更為利索的方式在你的Java ME應(yīng)用程序中加入單元測(cè)試。
本文將通過(guò)使用Java ME JUnit框架向你介紹JUnit測(cè)試;通過(guò)本文,你會(huì)發(fā)現(xiàn),如何獲取這些工具,如何使用它們進(jìn)行測(cè)試以及如何使用它們來(lái)構(gòu)建質(zhì)量更好的軟件。
二、 獲取Java ME單元測(cè)試框架
如今,市場(chǎng)上存在兩個(gè)可用的JavaME JUnit測(cè)試框架,它們是J2MEUnit和JMUnit。這兩個(gè)工程都是可自由下載的開(kāi)源框架,你可以從SourceForge.net上下載一個(gè)打包文件。
然而,這兩個(gè)開(kāi)源工程的工程主管(Elmar Sonnenschein和Brunno Silva,分別維護(hù)J2MEUnit和JMUnit),正在計(jì)劃把這兩個(gè)框架合并為一個(gè)。新的工程將在J2MEUnit工程基礎(chǔ)上得到進(jìn)一步鞏固。根據(jù)Sonnenschein本人的說(shuō)法,"因?yàn)楦嗟默F(xiàn)有用戶(hù)的工程都是基于SourceForge上的J2MEUnit框架;所以,我們計(jì)劃基于Brunno的JMUnit 2.0創(chuàng)建一個(gè)J2MEUnit 2.0發(fā)行版本。"Silva在一次最近的新聞發(fā)布會(huì)上聲稱(chēng)在今年年底可能無(wú)法完成產(chǎn)品的合并和一個(gè)2.0版本的發(fā)行。Silva進(jìn)一步建議說(shuō),新的工程"不想破壞這兩個(gè)框架的當(dāng)前用戶(hù)的原有代碼,因此,原始代碼會(huì)繼續(xù)存在,只是不再建議使用。新的單元框架應(yīng)該展現(xiàn)出兩個(gè)框架-JMUnit和J2MEUnit-各自的特色。"
三、 一個(gè)簡(jiǎn)單的示例應(yīng)用程序
在分析各種單元測(cè)試框架之前,你需要一些簡(jiǎn)單的代碼以備測(cè)試之用。在這個(gè)例子中,下面這個(gè)簡(jiǎn)單的Conversion類(lèi)能夠用于創(chuàng)建并測(cè)試Java ME單元測(cè)試。
public class DistanceConversion {
public static int feetToMeters(int ft){
return (ft * 3048)/10000;
}
public static int metersToFeet(int meters){
return (meters*3281)/1000;
}
public static int milesToKM(int miles){
return (miles*1609)/1000;
}
public static int kmToMiles(int km){
return (km*6214)/10000;
}
}
public class TemperatureConversion {
public static float fahrenheitToCelsius (float degrees){
return ((degrees-32)/9)*5;
}
public static float celsiusToFahrenheit (float degrees){
return ((degrees * 9)/5)+32;
}
public static boolean isHotter (float degFaren, float degCel){
return ((fahrenheitToCelsius(degFaren))-degCel) > 0;
}
public static boolean isCooler (float degFaren, float degCel){
return ((fahrenheitToCelsius(degFaren))-degCel) < 0;
}
}