鐗堟潈澹版槑錛氳漿杞芥椂璇蜂互瓚呴摼鎺ュ艦寮忔爣鏄庢枃绔犲師濮嬪嚭澶勫拰浣滆呬俊鎭強鏈0鏄?/a>
http://bigwhite.blogbus.com/logs/535124.html
涓婂懆鍏垜浠?/span>Dominoo group璁ㄨ錛堜互涓嬬О璁ㄨ錛?/span>TDD鍜?/span>JUnit鐨勬椂鍊欙紝鎻愬埌榪?/span>Mock Object錛岄偅嬈″彲鑳芥槸鎴戠涓嬈″惉鍒?/span>Mock Object榪欎釜姒傚康錛岀▼搴忓憳瀵規柊椴滅殑鐨勪笢瑗塊兘鏄晱鎰熺殑錛屾墍浠ヤ粖澶╂櫄涓婅姳浜嗕竴浜涙椂闂翠簡瑙d簡涓涓?/span>Mock Object鐨勬蹇碉紝鍋氫簡涓浜涚畝鍗曞疄璺點?/span>
鏈
Tested Object – 琚祴瀵硅薄
Mock – 鍋囩殑 or 浠垮埗鐨勫璞?/span>
What is Mock Object?
鍦ㄨ璁轟腑鎴戝ぇ鑷翠簡瑙e埌Mock Object涓鑸槸鐢ㄦ潵鍋氳緟鍔╁崟鍏冩祴璇曪紝瀹冭礋璐i殧紱?/span>Tested Object涓庣湡瀹炵幆澧冧腑妯″潡鎴栧疄浣?/span>(Real world object)鐨勪氦浜掞紝騫?#8220;鏇夸唬”or “鍐掑厖”榪欎簺鐪熷疄妯″潡鎴栧疄浣撲笌Tested Object榪涜浜や簰銆?/span>
鍦?#8220;JUnit in action”榪欐湰涔︿腑鍏充簬Mock Object鐨勬弿榪板涓嬶細
A mock object (or mock for short) is an object created to stand in for an object that your code will be collaborating with. Your code can call methods on the mock object, which will deliver results as set up by your tests.
Mock Object緇欐垜甯︽潵浠涔堝ソ澶勶紵
鐪嬬湅涓嬮潰鐨勫浘錛?/span>
|-----------------------------------------------------------------|
| |
| |---------------------| | |-----------------------------|
| | Tested | <------------------------------------------à | External Mock Object |
| | Object | | |----------------------------|
| |---------------------| |
| /|\ |--------------------| |
| |-------銆?| Internal Mock | |
| | Object | |
| |--------------------| |
| [Your system scope] |
|--------------------------------------------------------- --------|
鍦ㄦ祴璇曚綘鐨?/span>Tested Object鏃訛紝浣犲彲鑳戒細涓庝綘緋葷粺鍐呯殑鏌愪釜妯″潡鎴栫郴緇熷鏌愪釜瀹炰綋浜や簰錛岃岃繖浜涙ā鍧楁垨瀹炰綋鍦ㄤ綘鍋氬崟鍏冩祴璇曠殑鏃跺欏彲鑳藉茍涓嶅瓨鍦紝榪欐椂錛?/span>
Ø Internal Mock Object鍙兘鏄竴涓綘鐨勭郴緇熷皻鏈畬鎴愮殑妯″潡鐨?#8220;鏇胯韓”(replacement)錛?/span>
Ø External Mock Object鍙兘鏄祴璇曚綘鐨?/span>Tested Object鏃墮渶瑕佺殑澶栭儴鐨勭幆澧冨疄浣撶殑“鏇胯韓”錛?/span>replacement錛夈?/span>
涓嶇煡閬撹繖鏍風粰Mock Object鍒嗙被鏄惁姝g‘J
鎴戜滑鏉ョ湅鐪嬩笌Real world object浜や簰鏈変粈涔堜笉瓚充箣澶勶細
Ø Real world object鐨勮涓哄叿鏈変笉紜畾鎬э紝鎴戜滑闅句簬鎺у埗瀹冧滑鐨勮緭鍑?/span>or榪斿洖緇撴灉銆?/span>
Ø Real world object鏈変簺鏃跺欐槸闅句簬琚緩绔嬬殑鎴栬呰鏄棤娉曡幏寰楃殑銆?/span>
Ø Real world object鐨勬湁浜涜涓洪毦浜庤瑙﹀彂錛屽紓佺洏宸叉弧錛岀綉緇?/span>error絳夈?/span>
Ø Real world object鍙兘涓嶅瓨鍦紝姣斿浣犵殑Tested Object闇瑕佷笌浣犵殑緋葷粺鐨勫彟涓涓?/span>module浜や簰錛岃屽彟涓涓?/span>module灝氭湭寮鍙戝畬姣曘?/span>
褰撶劧榪樹笉姝㈣繖浜涳紝鎴戜滑浠呬粎鏄垪鍑轟竴閮ㄥ垎銆?/span>
浣跨敤Mock Object鏇夸唬Real world object鍚庢垜浠氨浼氳В鍐充笂榪伴棶棰橈紝鎹㈠彞璇濊褰撲笂闈㈢殑鎯呭喌鍑虹幇鍚庯紝鎴戜滑灝卞彲浠ヤ嬌鐢?/span>Mock Object銆傝繖涔熸槸浠涔堟椂鍊欒浣跨敤Mock Object鐨?/span>answer銆?/span>
Mock Object鏄垜浠嚜宸辯紪鍐欑殑錛屾垜浠嫢鏈夋帶鍒跺畠鐨勭粷瀵圭殑鏉冨姏錛屾垜浠彲浠ュ畾鍒跺畠鐨勮涓哄拰杈撳嚭銆?/span>
Use Mock Object
浣跨敤Mock Object瑙e喅涓婅堪闂鍙垎涓夋璧幫細
1. Use an interface to describe the object
2. Implement the interface for production code
3. Implement the interface in a mock object for testing [3]
榪樻湁涓鐐瑰氨鏄浜?/span>Internal Mock Object鏃╂櫄浣犺瀹炵幇鍑哄叾Real world object鐨勶紝鍥犱負閭f槸浣犵郴緇熺殑涓閮ㄥ垎銆?/span>
涓涓敼鑷祫鏂?/span>[3]鐨勪緥瀛?/span>
public interface Environmental {
public long getTime();
// Other methods omitted...
}
瀵逛簬榪欐牱涓涓帴鍙o紝鎴戜滑鎻愪緵涓ょ瀹炵幇,
//real world object
public class SystemEnvironment implements Environmental {
public long getTime() {
return System.currentTimeMillis();
}
// other methods ...
}
//mock object
public class MockSystemEnvironment implements Environmental {
public long getTime() {
return currentTime;
}
public void setTime(Time aTime){
this.currentTime = aTime;
}
private Time currentTime;
//others
}
鎴戜滑鍙互鐪嬪埌鍦?/span>MockSystemEnvironment涓垜浠彁渚?#8220;setTime”鍑芥暟鏄負浜嗘彁渚涙帶鍒?/span>Mock Object鐨勬帴鍙c?/span>
鎴戜滑瑕佹祴璇曠殑綾?/span>
//TestedObject
public class TestedObject{
private Environmental env;
TestedObject(Environmental aEnv){
this.env = aEnv;
}
public boolean isAm(){
Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(env.getTime());
int hour = cal.get(Calendar.HOUR_OF_DAY);
if (hour <=12) return true;
return false;
}
}
灝嗚嫻嬭瘯鐨勭被鏀懼叆鍗曞厓嫻嬭瘯妗嗘灦
public class TestTestedObject extends TestCase {
public void testIsAm(){
MockSystemEnvironment env = new MockSystemEnvironment();
// Set up a target test time
Calendar cal = Calendar.getInstance();
cal.set(Calendar.YEAR, 2004);
cal.set(Calendar.MONTH, 10);
cal.set(Calendar.DAY_OF_MONTH, 1);
cal.set(Calendar.HOUR_OF_DAY, 16);
cal.set(Calendar.MINUTE, 55);
long t1 = cal.getTimeInMillis();
env.setTime(t1);
TestedObject to = new TestedObject(env);
assertFalse(to.isAm());
}
}
鍦ㄨ鍗曞厓嫻嬭瘯涓垜浠嬌鐢ㄤ簡Mock Object,騫朵笖鍦ㄤ嬌鐢ㄥ墠鎴戜滑鍒╃敤setTime鎺ュ彛錛岃緭鍏ヤ簡鎴戜滑闇瑕佺殑鍊箋傜粨鏋滄垜浠細閫氳繃嫻嬭瘯銆傚鏋滄垜浠嬌鐢?/span>Real Object錛屾垜浠緱鍒扮殑嫻嬭瘯緇撴灉灝嗘槸涓嶅浐瀹氱殑錛屽悗鑰呭彲涓嶆槸鎵鏈熸湜鐨勩備粠榪欎釜渚嬪瓙涓綘涔熷簲璇ヤ綋浼氬埌Mock object鐨勪竴浜涘ソ澶勪簡銆?/span>
濡傛灉鎴戜滑鎬繪槸鎵嬪姩鍐欐垜浠渶瑕佺殑Mock Object錛岄偅灝嗘槸涓涓緢澶х殑宸ヤ綔閲忋傜幇鍦ㄤ笟鐣屾湁浜?/span>Mock Objects銆?/span>easy mock絳夊紑婧愭鏋剁殑鏀寔錛屾槸鎴戜滑緙栧啓Mock object鍙樺緱瓚婃潵瓚婂鏄撱?/span>
鍙傝冭祫鏂欙細
1銆併?/span>Test-Driven Development – A practical guide銆?/span>
2銆併?/span>JUnit in action銆?/span>
3銆併?/span>Pragmatic Unit Testing銆?/span>