2022-04北風(fēng)網(wǎng)junit測(cè)試驅(qū)動(dòng)開發(fā)vip培訓(xùn)教程講課-之家_第1頁(yè)
2022-04北風(fēng)網(wǎng)junit測(cè)試驅(qū)動(dòng)開發(fā)vip培訓(xùn)教程講課-之家_第2頁(yè)
2022-04北風(fēng)網(wǎng)junit測(cè)試驅(qū)動(dòng)開發(fā)vip培訓(xùn)教程講課-之家_第3頁(yè)
2022-04北風(fēng)網(wǎng)junit測(cè)試驅(qū)動(dòng)開發(fā)vip培訓(xùn)教程講課-之家_第4頁(yè)
2022-04北風(fēng)網(wǎng)junit測(cè)試驅(qū)動(dòng)開發(fā)vip培訓(xùn)教程講課-之家_第5頁(yè)
已閱讀5頁(yè),還剩26頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、1 預(yù)備知識(shí)1.1 可變長(zhǎng)參數(shù)1.2 Assert1.3 Annoion2 1.簡(jiǎn)介JUnit 是 Java 語(yǔ)言事實(shí)上的標(biāo)準(zhǔn)單元測(cè)試庫(kù)。JUnit 的易用性無疑是它受歡迎的主要原因。也許你會(huì)這樣想:它做的事情不多,僅僅是做一些測(cè)試然后結(jié)果,JUnit 應(yīng)該是很簡(jiǎn)單的。XP-敏捷編程-JUnit 4.x 是最初由Erich Gamma 和Kent Beck 編寫的,能夠自動(dòng)化測(cè)試Java 代碼的框架,JUnit的一大主要特點(diǎn)是,它在執(zhí)行的時(shí)候,各個(gè)方法之間是相互獨(dú)立的,一個(gè)方法不會(huì)導(dǎo)致別的方法失敗,方法之間也不存在相互依賴的關(guān)系,彼此是獨(dú)立的。JUnit 4 是該庫(kù)以來最具里程碑意義的一次發(fā)布

2、。它的新特性主要是通過采用 Java 5 中的標(biāo)記(Anno ion)而不是利用子類、反射或命名機(jī)制來識(shí)別測(cè)試,從而簡(jiǎn)化測(cè)試。然而,JUnit 僅僅是一個(gè)工具而已。真正的優(yōu)勢(shì)來自于 JUnit 所采用的和技術(shù),而不是框架本身。單元測(cè)試、測(cè)試先行的編程和測(cè)試驅(qū)動(dòng)的開發(fā)并非都要在 JUnit 中實(shí)現(xiàn)。JUnit 本身的最后一次更新差不多是三年以前了。盡管它被證明比大多數(shù)框架更健壯、更持久,但是也發(fā)現(xiàn)了 bug;而更重要的是,Java 不斷在發(fā)展。Java 語(yǔ)言現(xiàn)在支持泛型(Raw Type)、枚舉(Enum)、可變長(zhǎng)度參數(shù)列表和注釋,這些特性為可重用的框架設(shè)計(jì)帶來了新的可能。新版本的 JUnit,

3、它利用 Java 5 的新特性(尤其是注釋)的優(yōu)勢(shì),使得單元測(cè)試比起用最初的JUnit 來說更加簡(jiǎn)單。用 Beck 的話來說,“JUnit 4 的是通過進(jìn)一步簡(jiǎn)化 JUnit,鼓勵(lì) JUnit 3.8 測(cè)試套件的向后兼容,但是的改進(jìn)。編寫的測(cè)試?!盝Unit 4 盡管保持了與現(xiàn)有的開發(fā)它仍然承諾是自 JUnit 1.0 以來 Java 單元測(cè)試方面最2.1 一個(gè)最簡(jiǎn)單的測(cè)試2.1.1 3.8 系列以前所有版本的 JUnit 都使用命名約定和反射來定位測(cè)試。例如,下面的代碼測(cè)試 1+1 等于2:import junit framework.TestCase;public class Additi

4、onTest extends TestCase privatex = 1;privatey = 1;public void testAddition() z = x + y;assertEquals(2, z);2.1.2 4.X 系列在 JUnit 4 中,測(cè)試是由 Test 注釋來識(shí)別的,如下所示:import.junit.Test;import junit framework.TestCase;public class AdditionTest extends TestCase privatex = 1;privatey = 1;Test public void testAddition

5、() z = x + y;assertEquals(2, z);使用注釋的優(yōu)點(diǎn)是不再需要將所有的方法命名為 testFoo()、testBar(),等等。而在 3.8 中如果你的方法不是以 test 開頭的,將不被解釋為測(cè)試方法。這允許您遵循最適合您的應(yīng)用程序名約定。通過繼承TestCase 類的方式,仍然可以工作,但是您不再需要擴(kuò)展它了。只要您用 Test 來注釋測(cè)試方法,就可以將測(cè)試方法放到任何類中。但是您需要導(dǎo)入 junit.Assert方法,如下所示:類以各種 assertimport.junit.Assert;public class AdditionTest privatex =

6、1;privatey = 1;Test public void addition() z = x + y;Assert.assertEquals(2, z);還可以使用 JDK 5 中新特性(sic import),使得與以前版本一樣簡(jiǎn)單:import s ic.junit.Assert.assertEquals;public class AdditionTest privatex = 1;privatey = 1;Test public void addition() z = x + y;assertEquals(2, z);這種方法使得測(cè)試受保護(hù)的方法非常容易,因?yàn)闇y(cè)試案例類現(xiàn)在可以擴(kuò)展包

7、含受保護(hù)方法的類了。2.2單元測(cè)試單元測(cè)試是由程序員編寫的,測(cè)試被測(cè)試代碼的某一個(gè)很小的、特定的功能區(qū)域的代碼。它可以用來確保在代碼或者程序運(yùn)行的環(huán)境中發(fā)生變化后,已經(jīng)存在的功能還是能夠執(zhí)行的。2.3 在 Eclipse 中使用 JUnit準(zhǔn)備創(chuàng)建一個(gè)新的工程,并增加JUnit 到庫(kù)到項(xiàng)目的BuildPath 中。創(chuàng)建一個(gè)普通類創(chuàng)建名字為MyClass的Java 文件牋牋牋牋牋牋public class MyClass 牋爌ublicmultiply(x,y) 牋牋牋 return x / y;牋爙創(chuàng)建測(cè)試類創(chuàng)建測(cè)試套件如果你有很多個(gè)測(cè)試,想要合并到一起來執(zhí)行,你可以創(chuàng)建一個(gè) TestSuit

8、e.在一個(gè) TestSuite 中的所有的測(cè)試將會(huì)被執(zhí)行。3 SetUp 和TearDown 及斷言方法3.1 3.8 系列JUnit 3 測(cè)試運(yùn)行程序(test runner)會(huì)在運(yùn)行每個(gè)測(cè)試之前自動(dòng)調(diào)用 setUp() 方法。該方法一般會(huì)初始化字段,打開日志,重置環(huán)境變量, 等等。例如,下面是摘自 XOM 的XSLTransformTest 中的 setUp() 方法:protected void setUp() System.setErr(new PrStream(new ByteArrayOutputStream();inputDir = new File(data);inputDir

9、 = new File(inputDir, xslt);inputDir = new File(inputDir, input);在 JUnit 3 中,您使用 tearDown() 方法,該方法類似于我在 XOM 中為消耗大量?jī)?nèi)存的測(cè)試所使用的方法:protected void tearDown() doc = null;System.gc();3.2 4.X 系列在 JUnit 4 中,您仍然可以在每個(gè)測(cè)試方法運(yùn)行之前初始化字段和配置環(huán)境。然而,完成這些操作的方法不再需要叫做 setUp(),只要用 Before 注釋來指示即可,如下所示:Before protected void ini

10、tialize() System.setErr(new PrStream(new ByteArrayOutputStream();inputDir = new File(data);inputDir = new File(inputDir, xslt);inputDir = new File(inputDir, input);甚至可以用 Before 來注釋多個(gè)方法,這些方法都在每個(gè)測(cè)試之前運(yùn)行:Before protected void findTestDataDirectory() inputDir = new File(data);inputDir = new File(inputDir

11、, xslt);inputDir = new File(inputDir, input);Before protected void redirectStderr() System.setErr(new PrStream(new ByteArrayOutputStream();對(duì)于 JUnit 4,我可以給它取一個(gè)更自然的名稱,并用 After 注釋它:Aftrotected void dise() doc = null;System.gc();與 Before 一樣,也可以用 After 來注釋多個(gè)清除方法,這些方法都在每個(gè)測(cè)試之后運(yùn)行。最后,您不再需要在超類中顯式調(diào)用初始化和清除方法,只要

12、它們不被覆蓋即可,測(cè)試運(yùn)行程序?qū)⒏鶕?jù)需要自動(dòng)為您調(diào)用這些方法。超類中的 Before 方法在子類中的 Before 方法之前被調(diào)用(這反映了構(gòu)造函數(shù)調(diào)用的順序)。After 方法以反方向運(yùn)行:子類中的方法在超類中的方法之前被調(diào)用。否則,多個(gè) Before或 After 方法的相對(duì)順序就得不到保證。3.3 斷言方法3.8 系列,每一個(gè)類都繼承了一個(gè)叫做TestCase 的類,而TestCase 的父類是Assert 類4.x 系列,每一個(gè)可以不繼承任何的類,但是仍然可以直接使用importsic.junit.Assert.*;在 3.8 當(dāng)中,所有的測(cè)試類必須都是 TestCase 的子類4.X

13、 中,測(cè)試類可以是一個(gè)普通類,也可以去繼承一個(gè)類或者實(shí)現(xiàn)一個(gè)接口要實(shí)現(xiàn)測(cè)試,只需要在要測(cè)試的方法之前加Test 注釋same 相同equal相等4 注釋(Annoions)表格 1 Annoions5 新的斷言JUnit 4 為比較數(shù)組添加了兩個(gè) assert() 方法:Annoion含義Test public void method()定義一個(gè)要測(cè)試的方法Before public void method()在每一個(gè)測(cè)試之前都會(huì)被執(zhí)行的方法,這個(gè)方法常常用來進(jìn)行一些測(cè)試環(huán)境的準(zhǔn)備,比喻說讀入輸入數(shù)據(jù),初始化類Aftublic void method()與Before 進(jìn)行對(duì)應(yīng),做一個(gè)工作Be

14、foreClass public void method()在所有的測(cè)試開始之前執(zhí)行,這個(gè)方法在類運(yùn)行的時(shí)候運(yùn)行,而且只會(huì)運(yùn)行一次,所以常常用來做一些所有的方法都要依賴到工作,比喻說,數(shù)據(jù)庫(kù)的。AfterClass public void method()與BeforeClass 進(jìn)行對(duì)應(yīng),做一些類級(jí)別的工作Ignore表明方法是被忽略的,這個(gè)方法非常實(shí)用,比喻你的方法已經(jīng) 修改,但是對(duì)應(yīng)的測(cè)試方法還沒有得到一致的修改的時(shí)候,可以忽略掉這個(gè)測(cè)試方法先。Test(expected=IllegalArgumentException.c lass)檢查測(cè)試方法是不是拋出了對(duì)應(yīng)的異常Test(time

15、out=100)如果方法的執(zhí)行操作所耗費(fèi)的毫秒數(shù)100MS,那么方法失敗。public s ic void assertEquals(Object expected, Object actual)public s ic void assertEquals(String message, Object expected,Object actual)這兩個(gè)方法以最直接的方式比較數(shù)組:如果數(shù)組長(zhǎng)度相同,且每個(gè)對(duì)應(yīng)的元素相同,則兩個(gè)數(shù)組相等,否則不相等。數(shù)組為空的情況也作了考慮。6 套件范圍的初始化JUnit 4 也引入了一個(gè) JUnit 3 中沒有的新特性:類范圍的 setUp() 和 tearDo

16、wn() 方法。任何用BeforeClass 注釋的方法都將在該類中的測(cè)試方法運(yùn)行之前剛好運(yùn)行一次, 而任何用AfterClass 注釋的方法都將在該類中的所有測(cè)試都運(yùn)行之后剛好運(yùn)行一次。例如,假設(shè)類中的每個(gè)測(cè)試都使用一個(gè)數(shù)據(jù)庫(kù)連接、一個(gè)網(wǎng)絡(luò)連接、一個(gè)非常大的數(shù)據(jù)結(jié)構(gòu),或者還有一些對(duì)于初始化和事情安排來說比較昂貴的其他資源。不要在每個(gè)測(cè)試之前都重新創(chuàng)建它,您可以創(chuàng)建它一次,并還原它一次。該方法將使得有些測(cè)試案例運(yùn)行起來快得多。例如,當(dāng)庫(kù)的代碼中的錯(cuò)誤處理時(shí),我通常喜歡在測(cè)試開始之前重定向 System.err,以我測(cè)試調(diào)用第便輸出不被預(yù)期的錯(cuò)誤消息打亂。然后我在測(cè)試結(jié)束后還原它,如下所示:/

17、This class tests a lot of error conditions, which/ Xalan annoyingly logs to System.err. This hides System.err/ before each test and restores it after each test.private PrStream systemErr;BeforeClass protected void redirectStderr() systemErr = System.err; / Holto the original valueSystem.setErr(new P

18、rStream(new ByteArrayOutputStream();AfterClass protected void tearDown() / restore the original valueSystem.setErr(systemErr);沒有必要在每個(gè)測(cè)試之前和之后都這樣做。但是一定要對(duì)待這個(gè)特性。它有可能會(huì)測(cè)試。如果一個(gè)測(cè)試在某種程度上改變了 BeforeClass 所初始化的的獨(dú)立性,并引入非預(yù)期的一個(gè)對(duì)象,那么它有可能會(huì)影響其他測(cè)試的結(jié)果。它有可能在測(cè)試套件中引入順序依賴,并隱藏bug。與任何優(yōu)化一樣,只在剖析和基準(zhǔn)測(cè)試證明您具有實(shí)際之后才實(shí)現(xiàn)這一點(diǎn)。這就是說,我看到了不止

19、一個(gè)測(cè)試套件運(yùn)行時(shí)間如此之長(zhǎng),以至不能像它所需要的那樣經(jīng)常運(yùn)行,尤其是那些需要建立很多網(wǎng)絡(luò)和數(shù)據(jù)庫(kù)連接的測(cè)試。(例如,LimeWire 測(cè)試套件運(yùn)行時(shí)間超過兩小時(shí)。)要加快這些測(cè)試套件,以便程序員可以更加經(jīng)常地運(yùn)行它們,您可以做的就是減少 bug。7 測(cè)試異常異常測(cè)試是 JUnit 4 中的最大改進(jìn)。舊式的異常測(cè)試是在拋出異常的代碼中放入 try 塊,然后在try 塊的末尾加入一個(gè) fail() 語(yǔ)句。例如,該方法測(cè)試被零除拋出一個(gè) ArithmeticException:public void testDiviByZero() try n = 2 / 0;fail(Divided by ze

20、ro!);catch (ArithmeticException sucs) assertNotNull(sucs.getMessage();該方法不僅難看,而且試圖代碼覆蓋工具,因?yàn)椴还軠y(cè)試是通過還是失敗,總有一些代碼不被執(zhí)行。在 JUnit 4 中,您現(xiàn)在可以編寫拋出異常的代碼,并使用注釋來該異常是預(yù)期的:Test(expected=ArithmeticException.class)public void divideByZero() n = 2 / 0;如果該異常沒有拋出(或者拋出了一個(gè)不同的異常),那么測(cè)試就將失敗。但是如果您想要測(cè)試異常的詳細(xì)消息或其他屬性,則仍然需要使用舊式的 tr

21、y-catch 樣式。8 可以忽略到測(cè)試也許您有一個(gè)測(cè)試運(yùn)行的時(shí)間非常地長(zhǎng)。不是說這個(gè)測(cè)試應(yīng)該運(yùn)行得更快,而是說它所做的工作從根本上比較復(fù)雜或緩慢。需要網(wǎng)絡(luò)服務(wù)器的測(cè)試通常都屬于這一類。如果您不在做可能會(huì)中斷該類測(cè)試的事情,那么您可能想要跳過運(yùn)行時(shí)間長(zhǎng)的測(cè)試方法,以縮短編譯-測(cè)試-調(diào)試周期。或者也許是一個(gè)因?yàn)槌瞿目刂品秶脑蚨〉臏y(cè)試。例如,W3C XInclude 測(cè)試套件測(cè)試 Java 還不支持的一些 Unicode 編碼的自動(dòng)識(shí)別。不必老是被迫盯住那些紅色波浪線,這類測(cè)試可以被注釋為 Ignore,如下所示:/ Java doesnt yet support/ the UTF-3

22、2BE and UTF32LE encodingsIgnore public void testUTF32BE()throws ParsingException, IOException, XIncludeException File input = new File(data/xinclude/input/UTF32BE.xml);doc = builder.build(input);result = XIncluder.resolve(doc);expectedResult = builder.build(new File(outputDir, UTF32BE.xml);assertEqu

23、als(expectedResult, result);測(cè)試運(yùn)行程序?qū)⒉贿\(yùn)行這些測(cè)試,但是它會(huì)這些測(cè)試被跳過了。但是一定要。最初編寫這些測(cè)試可能有一定的原因。如果忽略這些測(cè)試,那么它們期望測(cè)試的代碼可能會(huì)中斷,并且這樣的中斷可能不能被檢測(cè)到。忽略測(cè)試只是一個(gè)權(quán)宜之計(jì),不是任何問題的真正解決方案。9 時(shí)間測(cè)試10 Failure 和 ErrorFailure 指的是由于預(yù)期的結(jié)果與實(shí)際運(yùn)行的測(cè)試的結(jié)果不同而導(dǎo)致的實(shí)際運(yùn)行單元的結(jié)果不同所導(dǎo)致,例如當(dāng)使用 assertEquals()或其它 assert()方法斷言失敗時(shí),就會(huì)報(bào)出 Failure,如果發(fā)現(xiàn)Faulure,你就要去檢查你的測(cè)試方法或

24、者是被測(cè)試方法中編寫的邏輯是否有誤。Error 指的是編寫程序時(shí)沒有考慮到。在執(zhí)試的斷言之前,程序就因?yàn)槟撤N類型的意外 而 停 止 , 比 喻 說在 操 作 數(shù) 組 的 時(shí) 候 , 因 為 存 取 超 出 索 引 會(huì)ArrayIndexOutOfBoundsException,這個(gè)時(shí)候程序就會(huì)報(bào)出 Error,程序?qū)o法運(yùn)行下去,提前結(jié)束,這個(gè)時(shí)候你要檢查被測(cè)試方法中是不是有欠缺考慮到地方。看一個(gè)具體的例子:import junit.framework.TestCase;publicclass ObjectArrayTestextendsTestCase牋 publicvoid testAdd

25、() ObjectArray objArr牋牋牋=newObjectArray();牋牋牋 Object testObj = new Object();牋牋牋 Object obj = objArr.setObject(0, testObj);牋牋牋 assertEquals(testObj, obj);牋如果執(zhí)行這個(gè)測(cè)試的話,Eclipse 會(huì)提示你創(chuàng)建一個(gè)名字為 ObjectArray 的類,在其中要求你創(chuàng)建一個(gè)名字為 setObject 的方法。假設(shè)你創(chuàng)建的類的樣子如下:public class ObjectArray 牋 public Object setObject(testObj)

26、 i, Object牋爎 eturn null;牋如果現(xiàn)在你來運(yùn)試的話,會(huì)出現(xiàn)以下類似的界面:大家注意看,里面報(bào)出了 Failures:1為什么呢?ObjecttestObj);obj=objArr.setObject(0,牋 assertEquals(testObj, obj);看這里的斷言,Object obj 這一行很明顯是可以運(yùn)行的,只是返回的是一個(gè) null 值,接下來,assertEquals(.)也是可以運(yùn)行的,只不過期望值為 testObjc,而實(shí)際值為一個(gè)會(huì)有一個(gè) failure 產(chǎn)生。這是很正常的一種現(xiàn)象。null,所以如果把被測(cè)試類改變一下:public class Ob

27、jectArray 牋 Object objs;牋 public Object setObject( testObj) i, Object牋爎 eturn objsi;牋將會(huì)產(chǎn)生如下的結(jié)果:那么為什么會(huì)產(chǎn)生這樣的?因?yàn)閷?duì)源代碼做了修改以后,在執(zhí)行到ObjecttestObj);obj=objArr.setObject(0,牋 assertEquals(testObj, obj);時(shí)候,首先執(zhí)行 Object obj這句,在這一句的時(shí)候,被測(cè)試代碼中出現(xiàn)了 java.lang.NullPoerException異常,這個(gè)可以通過public sic void main(String args)牋

28、爅unit.textui.TestRunner.run(ObjectArrayTest.class);牋查看到:11Easy MockEasyMock 總覽接下來,讓我告訴大家如何使用 JUnit 和 EasyMock 框架來進(jìn)行單元測(cè)試。的第一個(gè)例子非常簡(jiǎn)單,但是在現(xiàn)實(shí)情況下,你通常是在一些類里使用另外的一些類。在進(jìn)行真正的測(cè)試之前,你可能需要做很多的工作,比喻說安置大量的環(huán)境代碼,啟動(dòng)一種大型的、復(fù)雜的系統(tǒng),可能是數(shù)據(jù)庫(kù)、功過劉或者是某一種類型的 IDE 環(huán)境,你的預(yù)設(shè)環(huán)境代碼需要是系統(tǒng)進(jìn)入某種特定的狀態(tài),以便按照測(cè)試所需要的方法進(jìn)行響應(yīng)。但是這種工作不大可能很快就能完成。為了對(duì)一部分類進(jìn)

29、行單元測(cè)試,你需要建立和控制另外一些類。最好的辦法就是為需要測(cè)試的類創(chuàng)建一個(gè)模擬對(duì)象。你可以自己手工的編寫類,也可以使用 EasyMock 來產(chǎn)生這些對(duì)象。模擬對(duì)象提供了一種經(jīng)過證明是成功的解決方案。當(dāng)很難或不可能為某種難以處理的資源創(chuàng)建需要的狀態(tài)或者存取某種資源受限時(shí),你就可以使用模擬對(duì)象。模擬對(duì)象取代真實(shí)對(duì)象的位置,用于測(cè)試一些與真實(shí)對(duì)象進(jìn)行交互或依賴于真實(shí)對(duì)象的功能。模擬對(duì)象背后的基本就是創(chuàng)建輕量級(jí)的、可控制的對(duì)象來代替為了編寫測(cè)試為需要使用的對(duì)象。模擬對(duì)象還能夠讓你指定和測(cè)試你的代碼與模擬對(duì)象本身之間的交互。說的再直白一點(diǎn),一個(gè)模擬對(duì)象就是一個(gè)簡(jiǎn)單的接口或者是類,在里面你可以定義一個(gè)特

30、定的方法調(diào)用之后的簡(jiǎn)單的輸出。使用 Junit 和 Easy Mock從 EasyMock 到主頁(yè)上EasyMock, 把得到的 easymock.jar 增加到你的 classpath 中。創(chuàng)建一個(gè) Java 工程 JavaMockTest,創(chuàng)建下面的這些類。eCalculator 是要被測(cè)試的類,這個(gè)類用來根據(jù)一個(gè)人的職位來計(jì)算一個(gè)人的工資的方法。packagee;public enumition S, PROGRAMMER, SURFERpackagee.exceptions;public classitionException extends RuntimeException priv

31、ate sic final long serialVerUID = 1L;publicitionException(String message) super(message);packagee.exceptions;public class CalcMethodException extends RuntimeException private sic final long serialVerUID = 1L;public CalcMethodException(String message) super(message);packagee.method;importe.ition;publ

32、icerface ICalcMethod publicabstract double calc(itionition);packagee;importe.exceptions.CalcMethodException;importe.exceptions.itionException;importe.method.ICalcMethod;publicclasseCalculatorprivate ICalcMethod calcMethod;privateitionition;public void setCalcMethod(ICalcMethod calcMethod)this.calcMe

33、thod=calcMethod;publicvoid setition(itionition)this.ition =ition;publicdouble calc ()if (calcMethod=null)thrownew CalcMethodException(CalcMethod not yet maained);if (ition=null)thrownewitionException(ition not yet maained);return calcMethod.calc(ition);使用 Eclipse 的 JUnit 功能為eCalulator 創(chuàng)建一個(gè)測(cè)試。在例子中,我同

34、時(shí)創(chuàng)建一個(gè)新的源文件夾,名字為test,我把我創(chuàng)建的測(cè)試類全部放到里面。下面就是一個(gè)使用EasyMock 創(chuàng)建的測(cè)試。packagee;importsic.junit.Assert.assertEquals;importsic.junit.Assert.fail;importe.exceptions.CalcMethodException;importe.exceptions.itionException;importe.method.ICalcMethod;import.easymock.EasyMock;import.junit.Before;import.junit.Test;publi

35、cclasseCalculatorTest private ICalcMethod calcMethod;privateeCalculator calc;Beforepublic void setUp() throws Exception calcMethod = EasyMock.createMock(ICalcMethod.class);calc = neweCalculator();Testpublic void testCalc1() / Setting up the expected value of the method call calcEasyMock.expect(calcM

36、ethod.calc(ition.S).andReturn(70000.0).times(2);EasyMock.expect(calcMethod.calc(ition.PROGRAMMER).andReturn(50000.0);/ Setup is finished need to activate themockEasyMock.replay(calcMethod);calc.setCalcMethod(calcMethod);try calc.calc();fail(Exception did not occur); catch (itionException e) calc.set

37、ition(ition.S);assertEquals(70000.0, calc.calc();assertEquals(70000.0, calc.calc();calc.setition(ition.PROGRAMMER);assertEquals(50000.0, calc.calc();calc.setition(ition.SURFER);EasyMock.verify(calcMethod);Test(expected = CalcMethodException.class)public void testNoCalc() calc.setition(ition.SURFER);

38、calc.calc();Test(expected =itionException.class)public void testNoition() EasyMock.expect(calcMethod.calc(ition.S).andReturn(70000.0);EasyMock.replay(calcMethod);calc.setCalcMethod(calcMethod);calc.calc();Test(expected =itionException.class)public void testCalc2() / Setting up the expected value of

39、the method call calcEasyMock.expect(calcMethod.calc(ition.SURFER).andThrow(newitionException(t know this guy).times(1);/ Setup is finished need to activate the mockEasyMock.replay(calcMethod);calc.setition(ition.SURFER);calc.setCalcMethod(calcMethod);calc.calc();expect 方法告知 EasyMock 希望得到一個(gè)特定的方法,使用一些

40、特定的參數(shù),addReturn 為某一個(gè)方法定義返回值。times 方法定義了模擬對(duì)象將被調(diào)用幾次。 reply 方法需要在讓模擬對(duì)象可用之前被調(diào)用。執(zhí)行完測(cè)試之后,你可以調(diào)用 verify 方法來檢查模擬對(duì)象是不是跟預(yù)期的一樣被調(diào)用了。12 使用 HttpUnit 測(cè)試 Html測(cè)試 1:測(cè)試網(wǎng)頁(yè)是否存在要測(cè)試一個(gè)網(wǎng)頁(yè)是否存在,只要簡(jiǎn)單的通過 WebConversation 的 getResponse()方法即可,例如:WebConversation webConversation = new WebConversation();webConversation.getResponse(牋牋牋

41、牋牋牋 );如果找不到網(wǎng)頁(yè),則會(huì)產(chǎn)生一個(gè) Error。HttpNotFoundException,由于不是斷言錯(cuò)誤,所以這會(huì)在 JUnit 中測(cè)試 2:Get、t您可以分別使用GetMethodWebRequest 或tMethodWebRequest 來發(fā)出Get 或t 請(qǐng)求,例如:WebConversation webConversation = new WebConversation();WebRequest request =new GetMethodWebRequest();WebResponse response =webConversation.getResponse(request);要在請(qǐng)求中加上參數(shù),可以使用 setParamter()方法,例如:request.setParameter(username,ge);測(cè)試 3:取得表格信息您可以從 WebResponse 中取得相關(guān)的 HTML 信息,假設(shè)網(wǎng)頁(yè)中有如下這樣的一個(gè)表格:下面的程序

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論