欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
使用MOCK對象進(jìn)行單元測試 - zhangwenjun8045 - JavaEye技術(shù)網(wǎng)...

使用MOCK對象進(jìn)行單元測試

1.出了什么問(wèn)題?
單元測試的目標是一次只驗證一個(gè)方法,小步的前進(jìn),細粒度的測試,但是假如某個(gè)方法依賴(lài)于其他一些難以操控的東東,比如說(shuō)網(wǎng)絡(luò )連接,數據庫連接,或者是Servlet容器,那么我們該怎么辦呢?
要是你的測試依賴(lài)于系統的其他部分,甚至是系統的多個(gè)其他部分呢?在這種情況下,倘若不小心,你最終可能會(huì )發(fā)現自己幾乎初始化了系統的每個(gè)組件,而這只是為了給一個(gè)測試創(chuàng )造足夠的運行環(huán)境讓它們可以運行起來(lái)。忙乎了大半天,看上去我們好像有點(diǎn)違背了測試的初衷了。這樣不僅僅消耗時(shí)間,還給測試過(guò)程引入了大量的耦合因素,比如說(shuō),可能有人興致沖沖地改變了一個(gè)接口或者數據庫的一張表,突然,你那卑微的單元測試的神秘的掛掉了。在這種情況發(fā)生幾次之后,即使是最有耐心的開(kāi)發(fā)者也會(huì )泄氣,甚至最終放棄所有的測試,那樣的話(huà)后果就不能想像了。
再讓我們看一個(gè)更加具體的情況:在實(shí)際的面向對象軟件設計中,我們經(jīng)常會(huì )碰到這樣的情況,我們在對現實(shí)對象進(jìn)行構建之后,對象之間是通過(guò)一系列的接口來(lái)實(shí)現。這在面向對象設計里是最自然不過(guò)的事情了,但是隨著(zhù)軟件測試需求的發(fā)展,這會(huì )產(chǎn)生一些小問(wèn)題。舉個(gè)例子,用戶(hù)A現在拿到一個(gè)用戶(hù)B提供的接口,他根據這個(gè)接口實(shí)現了自己的需求,但是用戶(hù)A編譯自己的代碼后,想簡(jiǎn)單模擬測試一下,怎么辦呢?這點(diǎn)也是很現實(shí)的一個(gè)問(wèn)題。我們是否可以針對這個(gè)接口來(lái)簡(jiǎn)單實(shí)現一個(gè)代理類(lèi),來(lái)測試模擬,期望代碼生成自己的結果呢?
幸運的是,有一種測試模式可以幫助我們:mock對象。Mock對象也就是真實(shí)對象在調試期的替代品。

2.現在需要Mock對象嗎?
關(guān)于什么時(shí)候需要Mock對象,Tim Mackinnon給我們了一些建議:
----- 真實(shí)對象具有不可確定的行為(產(chǎn)生不可預測的結果,如股票的行情)
----- 真實(shí)對象很難被創(chuàng )建(比如具體的web容器)
----- 真實(shí)對象的某些行為很難觸發(fā)(比如網(wǎng)絡(luò )錯誤)
----- 真實(shí)情況令程序的運行速度很慢
----- 真實(shí)對象有用戶(hù)界面
----- 測試需要詢(xún)問(wèn)真實(shí)對象它是如何被調用的(比如測試可能需要驗證某個(gè)回調函數是否被調用了)
----- 真實(shí)對象實(shí)際上并不存在(當需要和其他開(kāi)發(fā)小組,或者新的硬件系統打交道的時(shí)候,這是一個(gè)普遍的問(wèn)題)
3.如何實(shí)現Mock對象?
使用mock對象進(jìn)行測試的時(shí)候,我們總共需要3個(gè)步驟,分別是:
----- 使用一個(gè)接口來(lái)描述這個(gè)對象
----- 為產(chǎn)品代碼實(shí)現這個(gè)接口
----- 以測試為目的,在mock對象中實(shí)現這個(gè)接口
在此我們又一次看到了針對接口編程的重要性了,因為被測試的代碼只會(huì )通過(guò)接口來(lái)引用對象,所以它完全可以不知道它引用的究竟是真實(shí)的對象還是mock對象,下面看一個(gè)實(shí)際的例子:一個(gè)鬧鐘根據時(shí)間來(lái)進(jìn)行提醒服務(wù),如果過(guò)了下午5點(diǎn)鐘就播放音頻文件提醒大家下班了,如果我們要利用真實(shí)的對象來(lái)測試的話(huà)就只能苦苦等到下午五點(diǎn),然后把耳朵放在音箱旁...我們可不想這么笨,我們應該利用mock對象來(lái)進(jìn)行測試,這樣我們就可以模擬控制時(shí)間了,而不用苦苦等待時(shí)鐘轉到下午5點(diǎn)鐘了。下面是代碼:

public interface Environmental {
private boolean playedWav = false;
public long getTime();
public void playWavFile(String fileName);
public boolean wavWasPlayed();
public void resetWav();
}


真實(shí)的實(shí)現代碼:

public class SystemEnvironment implements Environmental {
public long getTime() {
return System.currentTimeMillis();
}
public void playWavFile(String fileName) {
playedWav = true;
}
public boolean wavWasPlayed() {
return playedWav;
}
public void resetWav() {
playedWav = false;
}
}


下面是mock對象:

public class MockSystemEnvironment implements Environmental {
private long currentTime;
public long getTime() {
return currentTime;
}
public void setTime(long currentTime) {
this.currentTime = currentTime;
}
public void playWavFile(String fileName) {
playedWav = true;
}
public boolean wavWasPlayed() {
return playedWav;
}
public void resetWav() {
playedWav = false;
}
}

下面是一個(gè)調用getTime的具體類(lèi):

import java.util.Calendar;

public class Checker {
private Environmental env;
public Checker(Environmental env) {
this.env = env;
}
public void reminder() {
Calendar cal = Calendar.getInstance();
cal.setTimeInMills(env.getTime());
int hour = cal.get(Calendar.HOUR_OF_DAY);
if(hour >= 17) {
env.playWavFile("quit_whistle.wav");
}
}
}

使用env.getTime()的被測代碼并不知道測試環(huán)境和真實(shí)環(huán)境之間的區別,因為它們都實(shí)現了相同的接口?,F在,你可以借助mock對象,通過(guò)把時(shí)間設置為已知值,并檢查行為是否如預期那樣來(lái)編寫(xiě)測試。

import java.util.Calendar;
import junit.framework.TestCase;

public class TestChecker extends TestCase {
public void testQuittingTime() {
MockSystemEnvironment env = new MockSystemEnvironment();
Calendar cal = Calendar.getInstance();
cal.set(Calendar.YEAR, 2006);
cal.set(Calendar.MONTH, 11);
cal.set(Calendar.DAY_OF_MONTH,7);
cal.set(Calendar.HOUR_OF_DAY, 16);

cal.set(Calendar.MINUTE, 55);
long t1 = cal.getTimeInMillis();
env.setTime(t1);
Checker checker = new Checker(env);
checker.reminder();
assertFalse(env.wavWasPlayed());
t1 += (5*60*1000);
env.setTime(t1);
checker.reminder();
assertTrue(env.wavWasPlayed());
env.resetWav();
t1 += 2*60*60*1000;
env.setTime(t1);
checker.reminder();
assertTrue(env.wavWasPlayed());
}
}


這就是mock對象的全部:偽裝出真實(shí)世界的某些行為,使你可以集中精力測試好自己的代碼。

4.好像有一些麻煩
如果每次都像上面那樣自己寫(xiě)具體的mock對象,問(wèn)題雖然解決了,但是好像有一些麻煩,不要著(zhù)急,已經(jīng)有一些第三方現成的mock對象供我們使用了。使用 Mock Object進(jìn)行測試,主要是用來(lái)模擬那些在應用中不容易構造(如HttpServletRequest必須在Servlet容器中才能構造出來(lái))或者比較復雜的對象(如JDBC中的ResultSet對象)從而使測試順利進(jìn)行的工具。目前,在Java陣營(yíng)中主要的Mock測試工具有JMock,MockCreator,Mockrunner,EasyMock,MockMaker等,在微軟的.Net陣營(yíng)中主要是Nmock,.NetMock等。
下面就以利用EasyMock模擬測試Servlet組件為例,代碼如下: 編譯并將其當做一個(gè)Test Case運行,會(huì )發(fā)現兩個(gè)測試方法均測試成功。我們可以看到easymock已經(jīng)幫助我們實(shí)現了一些servlet組件的mock對象,這樣我們就可以擺脫web容器和servlet容器來(lái)輕松的測試servlet了。

import org.easymock.*;
import junit.framework.*;
import javax.servlet.http.*;

public class MockRequestTest extends TestCase{
private MockControl control;
private HttpServletRequest mockRequest;
public void testMockRequest(){
//創(chuàng )建一個(gè)Mock HttpServletRequest的MockControl對象
control = MockControl.createControl(HttpServletRequest.class);
//獲取一個(gè)Mock HttpServletRequest對象
mockRequest = (HttpServletRequest) control.getMock();
//設置期望調用的Mock HttpServletRequest對象的方法
mockRequest.getParameter("name");
//設置調用方法期望的返回值,并指定調用次數
//以下后兩個(gè)參數表示最少調用一次,最多調用一次
control.setReturnValue("kongxx" ,1 ,1);
//設置Mock HttpServletRequest的狀態(tài),
//表示此Mock HttpServletRequest對象可以被使用
control.replay();
//使用斷言檢查調用
assertEquals("kongxx",mockRequest.getParameter("name"));
//驗證期望的調用
control.verify();
}
}


編譯并將其當做一個(gè)Test Case運行,會(huì )發(fā)現兩個(gè)測試方法均測試成功。我們可以看到easymock已經(jīng)幫助我們實(shí)現了一些servlet組件的mock對象,這樣我們就可以擺脫web容器和servlet容器來(lái)輕松的測試servlet了。

5.底層技術(shù)是什么?
讓我們來(lái)回憶一下,如果用戶(hù)使用C++和java的程序的生成,C++在最后的階段還需要連接才能生成一個(gè)整體程序,這在靈活性與java源代碼的機制是不能比的,java的各個(gè)類(lèi)是獨立的,打包的那些類(lèi)也是獨立的,只有在加載進(jìn)去才進(jìn)行連接,這在代碼被加載進(jìn)去的時(shí)候,我們還可以執行很多的動(dòng)作,如插入一些相關(guān)的業(yè)務(wù)需求,這也是AOP的一個(gè)焦點(diǎn),javassit代碼庫的實(shí)現類(lèi)似于這,正是利用這些,所以用java實(shí)現Mock對象是很簡(jiǎn)單的。

6.一些相關(guān)的資源
MockObject的主頁(yè) http://www.mockobjects.com/ 介紹了關(guān)鍵Mock Object的基本概念和目前在各個(gè)環(huán)境下主要的Mock測試工具。
JMock的主頁(yè)http://www.jmock.org/ 可以獲取JMock的最新代碼和開(kāi)發(fā)包,以及一些說(shuō)明文檔。
EasyMock的主頁(yè)http://www.easymock.org/ 可以獲取JMock的最新代碼和開(kāi)發(fā)包,以及一些說(shuō)明文檔。
NMock的主頁(yè)http://www.nmock.org/ 介紹了在Microsoft .Net平臺上進(jìn)行Mock測試的開(kāi)發(fā)工具。
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
使用Mock Object進(jìn)行測試
什么是mock測試(3)
使用EasyMock使單元測試更加容易
Servlet/JSP深入詳解:基于Tomcat的Web開(kāi)發(fā)--第二章01
JavaWeb框架系列-Servlet篇(2)
struts2訪(fǎng)問(wèn)request、session和application對象
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久