锘??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲黄色网址在线观看,国产偷国产偷亚洲清高动态图,日韩欧美亚洲中文乱码http://www.tkk7.com/jiangshachina/category/32066.html鍚屾槸Java鐖卞ソ鑰咃紝鐩擱綍蹇呮浘鐩歌瘑錛?lt;br>    a cup of Java, cheers!zh-cnWed, 04 Jan 2012 13:24:06 GMTWed, 04 Jan 2012 13:24:06 GMT60鎺㈢儲(chǔ)JUnit4鎵╁睍錛氭繁鍏ule(鍘?http://www.tkk7.com/jiangshachina/archive/2012/01/04/367802.htmlSha JiangSha JiangTue, 03 Jan 2012 16:13:00 GMThttp://www.tkk7.com/jiangshachina/archive/2012/01/04/367802.htmlhttp://www.tkk7.com/jiangshachina/comments/367802.htmlhttp://www.tkk7.com/jiangshachina/archive/2012/01/04/367802.html#Feedback0http://www.tkk7.com/jiangshachina/comments/commentRss/367802.htmlhttp://www.tkk7.com/jiangshachina/services/trackbacks/367802.html
鎺㈢儲(chǔ)JUnit4鎵╁睍錛氭繁鍏ule
鏈枃鏄?鎺㈢儲(chǔ)JUnit4鎵╁睍"緋誨垪涓殑絎笁綃囷紝灝嗚繘涓姝ユ帰絀禦ule鐨勫簲鐢紝灞曠ず濡備綍浣跨敤Rule鏉ユ浛浠BeforeClass錛孈AfterClass錛孈Before鍜孈After鐨勫姛鑳姐?2012.01.04鏈鍚庢洿鏂?

鍦ㄦ湰緋誨垪鐨勭浜岀瘒銆婃帰绱Unit4鎵╁睍錛氬簲鐢≧ule銆?/a>涓彁鍒幫紝鍙互浣跨敤Rule鏇夸唬鐜版湁鐨勫ぇ閮ㄥ垎Runner鎵╁睍錛岃屼笖涔熶笉鎻愬″Runner涓殑withBefores()錛寃ithAfters()絳夋柟娉曡繘琛屾墿灞曘傛湰鏂囧皢浠嬬粛濡備綍浣跨敤Rule鍘誨疄鐜癅Before錛孈After鍜孈BeforeClass鐨勭浉鍚屽姛鑳姐?/span>

1. BaseRule
    棣栧厛瑕佸垱寤轟竴涓緝閫氱敤鐨凾estRule瀹炵幇BaseRule錛屽畠浼?xì)閲婃攽謬轰袱涓墿灞曠偣锛屼竴涓湪鎵ц嫻嬭瘯鏂規(guī)硶涔嬪墠錛宐efore()錛涘彟涓涓湪鎵ц嫻嬭瘯鏂規(guī)硶涔嬪悗after()銆備笅闈㈡槸璇ョ被鐨勪唬鐮侊紝
public abstract class BaseRule implements TestRule {

    @Override
    
public Statement apply(Statement base, Description description) {
        
return new RuleStatement(base, description);
    }

    
private class RuleStatement extends Statement {

        
private Statement base = null;

        
private Description description = null;

        
private RuleStatement(Statement base, Description description) {
            
this.base = base;
            
this.description = description;
        }

        @Override
        
public void evaluate() throws Throwable {
            before(base, description);
            
try {
                base.evaluate();
            } 
finally {
                after(base, description);
            }
        }
    }

    
protected void before(Statement base, Description description) throws Throwable {

    }

    
protected void after(Statement base, Description description) {

    }
}
濡傛灉瀵笿Unit4鐨勬簮浠g爜鐣ユ湁璁ょ煡錛屽彲鑳戒細(xì)鍙戠幇BaseRule涓嶫Unit4鎻愪緵鐨凾estRule瀹炵幇ExternalResource浠g爜鐩鎬技銆傚叧閿殑涓嶅悓涔嬪鏄紝BaseRule涓殑before()涓巃fter()鏂規(guī)硶閮芥彁渚涗簡Statement涓嶥escription綾誨瀷鐨勫弬鏁幫紝榪欎嬌寰楀畠鑳藉瀹屾垚鏇村鏉傜殑宸ヤ綔銆?/span>

2. CalculatorTest
    鏈枃浣跨敤鐨凜alculatorTest灝嗕笉浣跨敤@BeforeClass錛孈Before鍜孈After錛岃屼細(xì)鍒涘緩涓や釜BaseRule鐨勫疄渚嬶細(xì)涓涓敤浜庢浛浠BeforeClass鍜孈AfterClass(鏈郴鍒楃洰鍓嶈繕鏈嬌鐢ㄨ繃@AfterClass)錛屽彟涓涓垯鏇夸唬@Before鍜孈After銆?/span>
public class CalculatorTest {

    
private static final DateFormat format = new SimpleDateFormat("yyyy-MM-dd_HH:mm:ss_SSS");

    
private static Calculator calculator = null;

    @ClassRule
    
public static BaseRule classRule = new BaseRule() {

        
protected void before(Statement base, Description description) throws Throwable {
            calculator 
= new Calculator();
        };
    };

    @Rule
    
public BaseRule rule = new BaseRule() {

        
protected void before(Statement base, Description description) throws Throwable {
            printBeforeLog(description);
        };

        
protected void after(Statement base, Description description) {
            printAfterLog(description);
        };

        
private void printBeforeLog(Description description) {
            TestLogger testLogger 
= description.getAnnotation(TestLogger.class);
            
if (testLogger != null) {
                StringBuilder log 
= new StringBuilder(format.format(new Date()));
                log.append(
" ").append(description.getClassName()).append("#")
                        .append(description.getMethodName()).append(
"")
                        .append(testLogger.log());
                System.out.println(log.toString());
            }
        }

        
private void printAfterLog(Description description) {
            StringBuilder log 
= new StringBuilder(format.format(new Date()));
            log.append(
" ").append(description.getClassName()).append("#")
                    .append(description.getMethodName()).append(
" end");
            System.out.println(log.toString());
        }
    };

    @Test
    @TestLogger(log 
= "a simple division")
    
public void simpleDivide() {
        
int value = calculator.divide(82);
        Assert.assertTrue(value 
== 4);
    }

    @Test(expected 
= ArithmeticException.class)
    @TestLogger(log 
= "divided by zero, and an ArithmeticException thrown.")
    
public void dividedByZero() {
        calculator.divide(
80);
    }
}
鍊煎緱娉ㄦ剰鐨勬槸錛宑lassRule鏄潤鎬佸彉閲忥紝瀹冧嬌鐢ˊClassRule Annotation錛屽皢鏇夸唬@BeforeClass鍜孈AfterClass錛涜宺ule鏄垚鍛樺彉閲忥紝瀹冧嬌鐢ˊRule Annotation錛屽皢鏇夸唬@Before鍜孈After銆備笌
涔嬪墠鏂囩珷涓嶅悓鐨勬槸錛屾澶勪笉浠呬細(xì)鍦ㄦ墽琛屾祴璇曟柟娉曚箣鍓嶆墦鍗版寚瀹氬唴瀹圭殑鏃ュ織(printBeforeLog())錛岃繕浼?xì)鍦ㄦ墽琛寢箣璇曟栆?guī)硶涔嬪悗鎵撳嵃涓鏉″浐瀹氭牸寮忕殑鏃ュ織(printAfterLog())錛岀敤浜庢寚紺鴻嫻嬭瘯鏂規(guī)硶宸茬粡鎵ц瀹屾瘯浜嗐?/span>

3. 灝忕粨
    浣跨敤Rule鍙互鏇夸唬緇濆ぇ閮ㄥ垎鐨凴unner鎵╁睍錛岃屼笖鐗瑰畾鐨凴ule瀹炵幇鍙互琚鐢紝涔熸槗浜庢坊鍔犳垨縐婚櫎Rule瀹炰緥錛岃繖浜涢兘澶уぇ鍦版彁楂樹簡鐏墊椿鎬с傚煎緱娉ㄦ剰鍦版槸錛屾湰鏂囪櫧鐒朵嬌鐢≧ule浠f浛浜咢BeforeClass錛孈AfterClass錛孈Before鍜孈After鐨勫姛鑳斤紝浣嗗茍涓嶆剰鍛崇潃灝卞簲褰撹繖涔堝仛銆傚氨鎴戜釜浜烘墍鎯籌紝灝嗕紶緇熺殑Fixture鍔熻兘浜ょ敱@BeforeClass錛孈AfterClass錛孈Before鍜孈After瀹炵幇錛屼粛鐒舵槸涓縐嶄笉閿欑殑閫夋嫨銆?/span>


Sha Jiang 2012-01-04 00:13 鍙戣〃璇勮
]]>
鎺㈢儲(chǔ)JUnit4鎵╁睍錛氬簲鐢≧ule(鍘?http://www.tkk7.com/jiangshachina/archive/2011/12/24/366801.htmlSha JiangSha JiangSat, 24 Dec 2011 15:26:00 GMThttp://www.tkk7.com/jiangshachina/archive/2011/12/24/366801.htmlhttp://www.tkk7.com/jiangshachina/comments/366801.htmlhttp://www.tkk7.com/jiangshachina/archive/2011/12/24/366801.html#Feedback0http://www.tkk7.com/jiangshachina/comments/commentRss/366801.htmlhttp://www.tkk7.com/jiangshachina/services/trackbacks/366801.html
鎺㈢儲(chǔ)JUnit4鎵╁睍錛氫嬌鐢≧ule
鍦ㄤ笂涓綃囨枃绔?a href="http://www.tkk7.com/jiangshachina/archive/2011/12/14/366289.html">銆婃帰绱Unit4鎵╁睍錛氭墿灞昍unner銆?/a>涓紝璁ㄨ浜嗕竴縐嶆墿灞旿Unit4鐨勬柟寮忥紝鍗籌紝鐩存帴淇敼Test Runner鐨勫疄鐜?BlockJUnit4ClassRunner)銆備絾榪欑鏂規(guī)硶鏄劇劧涓嶄究浜庣伒媧誨湴娣誨姞鎴栧垹闄ゆ墿灞曞姛鑳姐傛湰鏂囧皢浣跨敤JUnit4.7鎵嶅紑濮嬪紩鍏ョ殑鎵╁睍鏂瑰紡--Rule鏉ュ疄鐜扮浉鍚岀殑鎵╁睍鍔熻兘銆?2010.12.25鏈鍚庢洿鏂?

1. Rule
Rule鏄疛Unit4.7鎵嶅紑濮嬫彁渚涚殑涓縐嶆墿灞曟柟寮忥紝瀹冭兘澶熸浛浠eぇ閮ㄥ垎宸叉湁鐨凴unner鎵╁睍銆侸Unit鍖呭惈涓ょRule Annotation錛欯ClassRule涓嶡Rule銆侤ClassRule搴旂敤浜庢祴璇曠被涓殑闈欐佸彉閲忥紝鑰孈Rule搴旂敤浜庢垚鍛樺彉閲忥紱鐩稿悓鍦版槸錛岃繖浜涘彉閲忓繀欏繪槸TestRule鎺ュ彛鐨勫疄渚嬶紝涓旇闂慨楗扮蹇呴』涓簆ublic銆?br />鍦?a href="http://www.tkk7.com/jiangshachina/archive/2011/12/14/366289.html">涓婄瘒鍗氭枃涓紝瀵笲lockJUnit4ClassRunner榪涜浜嗘墿灞曪紝琚墿灞曠殑鏂規(guī)硶鏄痬ethodBlock錛岀幇鍦ㄦ垜浠潵鐪嬬湅璇ユ柟娉曚綋涓殑浠g爜錛?br />
protected Statement methodBlock(FrameworkMethod method) {
    Object test;
    
try {
        test
= new ReflectiveCallable() {
            @Override
            
protected Object runReflectiveCall() throws Throwable {
                
return createTest();
            }
        }.run();
    } 
catch (Throwable e) {
        
return new Fail(e);
    }

    Statement statement
= methodInvoker(method, test);
    statement
= possiblyExpectingExceptions(method, test, statement);
    statement
= withPotentialTimeout(method, test, statement);
    statement
= withBefores(method, test, statement);
    statement
= withAfters(method, test, statement);
    statement
= withRules(method, test, statement);
    
return statement;
}
浣嗗湪BlockJUnit4ClassRunner涓紝possiblyExpectingExceptions()錛寃ithPotentialTimeout()錛寃ithBefores()鍜寃ithAfters()閮藉凡緇忚鏍囨敞涓鴻繃鏃訛紝JUnit寤鴻浣跨敤Rule鏉ユ浛浠h繖浜涙柟娉曠殑鍔熻兘銆?br />
2. TestLogRule
濡傜1鑺傛墍榪幫紝Rule Annotation瑕佷綔鐢ㄤ簬TestRule鎺ュ彛鐨勫疄渚嬶紝閭d箞灝辮鍏堝垱寤轟竴涓猅estRule鐨勫疄鐜扮被銆?br />
public class TestLogRule implements TestRule {

    
private static final DateFormat format = new SimpleDateFormat("yyyy-MM-dd_HH:mm:ss_SSS");

    @Override
    
public Statement apply(Statement base, Description description) {
        TestLogger testLogger 
= description.getAnnotation(TestLogger.class);
        
if (testLogger != null) {
            StringBuilder log 
= new StringBuilder(format.format(new Date()));
            log.append(
" ").append(description.getClassName()).append("#")
                    .append(description.getMethodName()).append(
"")
                    .append(testLogger.log());
        System.out.println(log.toString());
    }

        
return base;
    }
}
濡備笂鎵紺猴紝TestLogRule涓?a href="http://www.tkk7.com/jiangshachina/archive/2011/12/14/366289.html">涓婄瘒鍗氭枃涓殑LoggedRunner鐨勪唬鐮佹湁璁稿鐩稿悓涔嬪錛屽姛鑳藉垯閮芥槸鎵撳嵃鍑烘寚瀹氱殑鏃ュ織錛屾瘡琛屾棩蹇楀張浠ュ綋鏃剁殑鎵ц鏃墮棿涓庡畬鏁存柟娉曞悕浣滀負(fù)鍓嶇紑銆?br />
3. 浣跨敤Rule鐨凜alculatorTest
涓嬮潰鏄柊鐨勬祴璇曠被CalculatorTest錛屽畠?yōu)畣涓嶄娇鐢˙lockJUnit4ClassRunner鐨勬墿灞昄oggedRunner浣滀負(fù)嫻嬭瘯鎵ц鍣紝鎵浠ヨ綾繪病鏈変嬌鐢ˊRunWith(LoggedRunner.class)錛岄偅涔堝湪鎵ц璇ユ祴璇曠被鏃朵粛鐒朵細(xì)浣跨敤BlockJUnit4ClassRunner銆?br />
public class CalculatorTest {

    
private static Calculator calculator = null;

    @Rule
    
public TestLogRule testLogRule = new TestLogRule();

    @BeforeClass
    
public static void createCalculator() {
        calculator 
= new Calculator();
    }

    @Test
    @TestLogger(log 
= "a simple division")
    
public void simpleDivide() {
        
int value = calculator.divide(82);
        Assert.assertTrue(value 
== 4);
    }

    @Test(expected 
= ArithmeticException.class)
    @TestLogger(log 
= "divided by zero, and an ArithmeticException thrown.")
    
public void dividedByZero() {
        calculator.divide(
80);
    }
}
涓?a href="http://www.tkk7.com/jiangshachina/archive/2011/12/14/366289.html">涓婄瘒鍗氭枃涓殑CalculatorTest鐩告瘮錛屾湰鏂囦腑鐨凜alculatorTest闄や簡娌℃湁浣跨敤LoggedRunner涔嬪錛岃繕澶氫簡涓よ浠g爜
@Rule
public TestLogRule testLogRule = new TestLogRule();
鍦ㄦ墽琛屽崟鍏冩祴璇曟柟娉曚箣鍓嶏紝BlockJUnit4ClassRunner浼?xì)璋冪敤TestRule/TestLogRule涓殑apply()鏂規(guī)硶錛屽嵆錛屼細(xì)鍏堟墦鍗板嚭鏃ュ織鍐呭銆?br />
4. 灝忕粨
浣跨敤Rule瀵笿Unit榪涜鎵╁睍錛岃兘澶熼伩鍏嶅榛樿Runner鐨勬墿灞曪紝涓烘祴璇曠被娣誨姞鎴栫Щ闄ule鍗佸垎鏂逛究錛岃屼笖Rule瀹炵幇綾繪湰韜篃鑳藉緢鏂逛究鍦拌澶嶇敤銆傚湪涓嬩竴綃囧崥鏂?/a>涓皢榪涗竴姝ユ帰绱ule鐨勫簲鐢ㄣ?/div>

Sha Jiang 2011-12-24 23:26 鍙戣〃璇勮
]]>
鎺㈢儲(chǔ)JUnit4鎵╁睍錛氭墿灞昍unner(鍘?http://www.tkk7.com/jiangshachina/archive/2011/12/14/366289.htmlSha JiangSha JiangTue, 13 Dec 2011 16:01:00 GMThttp://www.tkk7.com/jiangshachina/archive/2011/12/14/366289.htmlhttp://www.tkk7.com/jiangshachina/comments/366289.htmlhttp://www.tkk7.com/jiangshachina/archive/2011/12/14/366289.html#Feedback4http://www.tkk7.com/jiangshachina/comments/commentRss/366289.htmlhttp://www.tkk7.com/jiangshachina/services/trackbacks/366289.html
鎺㈢儲(chǔ)JUnit4鎵╁睍錛氭墿灞昍unner
鍦ㄤ嬌鐢↗Unit鐨勮繃紼嬩腑錛屽ぇ瀹跺彲鑳戒細(xì)瀵笿Unit榪涜涓浜涙墿灞曘傛湰鏂囦腑鐨勭ず渚嬩負(fù)JUnit4瀹氫箟浜嗕竴涓柊鐨凙nnotation錛屽茍鐩稿簲鍦板宸叉湁鐨凴unner榪涜鎵╁睍錛屼嬌鍏惰兘澶熻В鏋愭柊寮曞叆鐨凙nnotation銆?2011.12.25鏈鍚庢洿鏂?

鏈枃鑷嗛犱簡涓涓ず渚嬶紝浼?xì)鍦ㄦ墽琛屽崟鍏儖箣璇曟栆?guī)硶涔嬪墠錛岃嚜鍔ㄥ湴涓哄崟鍏冩祴璇曟柟娉曟墦鍗版棩蹇椼傝紺轟緥浼?xì)湄?fù)JUnit瀹氫箟涓涓柊鐨凙nnotation鐢ㄤ簬鎸囧畾瑕佹墦鍗扮殑鏃ュ織鍐呭錛屽茍瀵笿Unit榛樿鎻愪緵鐨凴unner瀹炵幇BlockJUnit4ClassRunner榪涜鎵╁睍錛屼嬌鍏惰兘澶熻瘑鍒繖涓柊鐨凙nnotation銆?br />
1. 瀹氫箟Annotation
    TestLogger鏄竴涓綔鐢ㄤ簬鏂規(guī)硶鐨凙nnotation錛屽畠鍙湁涓涓睘鎬э紝鐢ㄤ簬鎸囧畾鏃ュ織鐨勫唴瀹癸紝鍏朵唬鐮佸涓嬫墍紺猴紝
@Target({ ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
public @interface TestLogger {
    
public String log() default "";
}

2. 鎵╁睍Runner
    JUnit鎻愪緵浜嗚嫢騫蹭釜Runner鐨勫疄鐜幫紝濡侭lockJUnit4ClassRunner錛孲uite錛屽叾涓瑽lockJUnit4ClassRunner鐢ㄦ潵鎵ц鍗曚釜嫻嬭瘯鐢ㄤ緥綾匯侺oggedRunner灝嗘墿灞旴lockJUnit4ClassRunner錛岃鍐欏叾涓殑methodBlock()鏂規(guī)硶銆傛柊鐨刴ethodBlock()鏂規(guī)硶浼?xì)鍦ㄤ竴寮濮嬭瘯鍥捐幏鍙栬鎵ц嫻嬭瘯鏂規(guī)硶涓殑TestLogger Annotation錛屽鏋滃瓨鍦ㄧ殑璇濓紝灝變細(xì)鎵撳嵃鍑烘寚瀹氱殑鏃ュ織錛屾瘡琛屾棩蹇椾互褰撴椂鐨勬墽琛屾椂闂翠笌瀹屾暣鏂規(guī)硶鍚嶄綔涓哄墠緙銆傝綾葷殑浠g爜濡備笅鎵紺猴紝
public class LoggedRunner extends BlockJUnit4ClassRunner {

    
private static final DateFormat format = new SimpleDateFormat("yyyy-MM-dd_HH:mm:ss_SSS");

    
public LoggedRunner(Class<?> klass) throws InitializationError {
        
super(klass);
    }

    @Override
    
protected Statement methodBlock(FrameworkMethod method) {
        Method classMethod 
= method.getMethod();
        TestLogger loggerAnnotation 
= classMethod.getAnnotation(TestLogger.class);
        
if (loggerAnnotation != null) {
            StringBuilder log 
= new StringBuilder(format.format(new Date()));
            log.append(
" ").append(classMethod.getDeclaringClass().getName())
                    .append(
"#").append(classMethod.getName()).append("")
                    .append(loggerAnnotation.log());
            System.out.println(log.toString());
        }

        
return super.methodBlock(method);
    }
}

3. 搴旂敤紼嬪簭
    Calculator鏄竴涓畝鍗曠殑搴旂敤紼嬪簭錛屽叾涓畾涔変簡涓涓櫎娉曟柟娉曪紝浠g爜濡備笅鎵紺猴紝
public class Calculator {

    
public int divide(int a, int b) {
        
return a / b;
    }
}

4. 鍗曞厓嫻嬭瘯紼嬪簭
    CalculatorTest鏄竴涓畝鍗曠殑鍗曞厓嫻嬭瘯紼嬪簭錛屽畠浼?xì)鋴社敤涓たU嶆柟寮忓Calculator涓殑divide()鏂規(guī)硶榪涜鍗曞厓嫻嬭瘯銆傚叾浠g爜濡備笅鎵紺猴紝
@RunWith(LoggedRunner.class)
public class CalculatorTest {

    
private static Calculator calculator = null;

    @BeforeClass
    
public static void createCalculator() {
        calculator 
= new Calculator();
    }

    @Test
    @TestLogger(log 
= "a simple division.")
    
public void simpleDivide() {
        
int value = calculator.divide(82);
        Assert.assertTrue(value 
== 4);
    }

    @Test(expected 
= ArithmeticException.class)
    @TestLogger(log 
= "divided by zero, and an ArithmeticException thrown.")
    
public void dividedByZero() {
        calculator.divide(
80);
    }
}

鍊煎緱娉ㄦ剰鐨勬槸錛孋alculatorTest鐗瑰埆鎸囧畾LoggedRunner浣滀負(fù)嫻嬭瘯鎵ц鍣?@RunWith(LoggedRunner.class))錛涘悓鏃訛紝姣忎釜鍗曞厓嫻嬭瘯鏂規(guī)硶錛宻impleDivide()涓巇ividedByZero()錛岄兘浣跨敤浜咥nnotation TestLogger錛屼負(fù)鍏舵寚瀹氭棩蹇楀唴瀹廣傚綋鎵ц涓婅堪鍗曞厓嫻嬭瘯鏃訛紝浼?xì)鑷姩鍦版墦鍗板嚭濡備笅迮炲紡鐨勬棩蹇楀唴瀹瑰Q?br />
2011-12-13_23:48:38_218 test.CalculatorTest#simpleDivide: a simple division
2011-12-13_23:48:38_218 test.CalculatorTest#dividedByZero: divided by zero, and an ArithmeticException thrown.

5. 灝忕粨
閫氳繃瀵笲lockJUnit4ClassRunner鐨勬墿灞曪紝鍙互璁㎎Unit鍦ㄨ繍琛屾祴璇曠敤渚嬫椂鍋氫竴浜涢澶栫殑宸ヤ綔銆備絾榪欑鐩存帴淇敼榛樿Test Runner鐨勬柟寮忓茍涓嶈鎻愬★紝鍦?a href="http://www.tkk7.com/jiangshachina/archive/2011/12/24/366801.html">涓嬩竴綃囨枃绔?/a>涓皢浼?xì)浠嬀l嶄嬌鐢═est Rule鏉ヨ揪鍒扮浉鍚岀殑鎵╁睍鐩殑銆?br /> 

Sha Jiang 2011-12-14 00:01 鍙戣〃璇勮
]]>
緙栧啓濂界殑闈㈠悜瀵硅薄浠g爜(璇?http://www.tkk7.com/jiangshachina/archive/2008/10/07/232942.htmlSha JiangSha JiangTue, 07 Oct 2008 09:06:00 GMThttp://www.tkk7.com/jiangshachina/archive/2008/10/07/232942.htmlhttp://www.tkk7.com/jiangshachina/comments/232942.htmlhttp://www.tkk7.com/jiangshachina/archive/2008/10/07/232942.html#Feedback7http://www.tkk7.com/jiangshachina/comments/commentRss/232942.htmlhttp://www.tkk7.com/jiangshachina/services/trackbacks/232942.html緙栧啓濂界殑闈㈠悜瀵硅薄浠g爜

    鏈枃鏄?a >java.net涓婄殑涓綃?a >鍗氬錛屼綔鑰?a >Curtis Cooley瀵圭紪鍐欏ソ鐨勯潰鍚戝璞′唬鐮佹湁浜涘緩璁紝甯屾湜瀵瑰ぇ瀹墮兘鏈夋墍甯姪銆?2008.10.08鏈鍚庢洿鏂?

鑾峰彇緇忛獙娌℃湁鎹峰緞銆傜紪鍐欏ソ鐨勯潰鍚戝璞′唬鐮侀渶瑕佺粡楠岋紝浣嗚繖鍎挎湁涓夌鍋氭硶鑳藉府浣犲湪涓寮濮嬪氨寰堥『鍒╋紝鍗充究浣犳槸鑰侀〗鍥猴細(xì)
    1. 浣跨敤嫻嬭瘯椹卞姩寮鍙?TDD)緙栧啓浣犳墍鏈夌殑浠g爜
    2. 閬靛驚綆鍗曟硶鍒?/a>
    3. 鍛婁箣鑰岄潪闂箣

浣跨敤TDD緙栧啓鎵鏈変唬鐮?/strong>
    鎸?a href="http://ponderingobjectorienteddesign.blogspot.com/2008/09/tdd-is-design-activity.html">嫻嬭瘯鍏堣
緙栧啓鐨勪唬鐮佷笌鎸夋祴璇曞悗琛岀紪鍐欑殑浠g爜鏄瀬涓轟笉鍚岀殑浠g爜銆傛寜嫻嬭瘯鍏堣緙栧啓鐨勪唬鐮佹槸鏉捐﹀悎涓庨珮鑱氬悎鐨勩傚綋鏌愪釜灞炴ф垨縐佹湁鏂規(guī)硶闇瑕佹毚闇茬粰嫻嬭瘯紼嬪簭鏃訛紝鎸夋祴璇曞悗琛岀紪鍐欑殑浠g爜甯鎬細(xì)鎵撶牬灝佽錛屽洜涓鴻綾誨茍涓嶆槸涓轟簡嫻嬭瘯鑰岃璁$殑銆傚鏋滀綘棣栧厛緙栧啓嫻嬭瘯浠g爜錛屼綘鐨勪緷璧栧皢浼?xì)鏇村ソ锛屼綘鐨勪唬鐮仦畣鏄澗鑰﹀悎涓庨珮鑱氬悎鐨勩傚悗闈細(xì)鏈夋洿澶氬叧浜庢祴璇曡兘甯姪浣犺璁℃洿浣充唬鐮佺殑鍐呭銆?br />
閬靛驚綆鍗曟硶鍒?/strong>
    浠g爜鏄畝鍗曠殑錛屽彧瑕佸綋瀹冿細(xì)
    1. 鎵ц浜嗘墍鏈夌殑嫻嬭瘯
    2. 涓嶅寘鍚噸澶?br />     3. 琛ㄨ揪浜嗘墍鏈夌殑鎰忓浘
    4. 浣跨敤鏈灝戠殑綾誨拰鏂規(guī)硶
娉ㄦ剰鍒版垜鐢ㄧ殑鏄釜琚帓搴忎簡鐨勫垪琛ㄦ槸寰堥噸瑕佺殑銆傞『搴忔槸閲嶈鐨勩傚彧鏈変竴涓猰ain()鏂規(guī)硶鐨勭殑GodClass[1]涓嶄細(xì)鏄畝鍗曠殑銆傝繖涓被鍙兘鎵ц浜嗘墍鏈夌殑嫻嬭瘯錛屼絾鍦ㄤ換浣曟瘮"Hello, world!"鏇村鏉傜殑紼嬪簭涓紝瀹冭偗瀹氬寘鍚簡閲嶅錛屽茍涓斾篃娌℃湁琛ㄨ揪鍑哄叏閮ㄧ殑鎰忓浘銆?br /> 鎴戝姫鍔涗嬌鐢ㄧ畝鍗曟硶鍒欏幓鍏蟲敞If闂銆傛垜涓嶇煡閬撳浣曚嬌鐢ㄧ畝鍗曟硶鍒欏幓闃繪鏌愪漢緙栧啓閲嶉噺綰х殑If浠g爜銆傛湁浜哄彲鑳戒細(xì)鎻愬嚭涓嶅悓鎰忚錛屾垜涔熷皾璇曡繃錛屼絾榪欐牱鐨勯噸閲忕駭If浠g爜紜疄鏃犳硶琛ㄨ揪鎰忓浘銆備絾褰撲綘闃呰濡備笅浠g爜鏃?/span>

if (mobile.getType() == MobileTypes.STANDARD) {
  alert();
}
紜疄闅句互鐪嬪嚭鍏朵腑鐨勬剰鍥俱傝繖浜涗唬鐮佹棤璁哄浜庡摢涓柟娉曠殑涓婁笅鏂囩幆澧冧腑錛屾垜浠兘鑳界煡閬擄紝濡傛灉mobile鏄疭TANDARD綾誨瀷鐨勮瘽錛岄偅涔堝氨鎶ヨ銆傝屼綘鎵闇瑕佺殑鏇村鎰忓浘鍛紵
鎴戣繕鏈変竴鐐瑰効鐏墊劅鏄劇幇銆傚鏋滄湁閭f牱鐨勪唬鐮侊紝閭d箞鍦ㄥ叾瀹冨湴鏂硅偗瀹氳繕浼?xì)鏈夋洿澶氶偅鏍风殑浠g爜銆傝繖浜涗唬鐮佸彲鑳藉氨鍍忥細(xì)
if (mobile.getType() == MobileTypes.GAS) {
  registerGasReading();
}
鍜?/span>
if (mobile.getType() == MobileTypes.TEXT) {
  sendTextMessage();
}
鍜?/span>
if (mobile.getType() == MobileTypes.LOCATION) {
  notifyLocation();
}
浣犵湅鍑烘潵浜嗗悧錛熸垜鏄湅鍑烘潵浜嗐傚畠榪濆弽浜嗚鍒?錛屾湁寰堝鍦版柟閮借繚鍙嶄簡瑙勫垯2錛屽茍涓旀槸涓縐嶆渶鍧忕殑鎯呭艦銆傝繖孌典唬鐮佹湁澶氬閲嶅銆傞噸澶嶅皢鏋侀毦鍙戠幇銆傛墍浠ワ紝璇峰府鍔╅槻姝㈣繖縐嶆儏褰㈢殑鍙戠敓錛屾垜宸插寘鍚叾涓簡銆?br />
鍛婁箣鑰岄潪闂箣
綆璦涔嬶紝鍛婁箣鑰岄潪闂箣鎰忔寚涓嶈鍏堥棶涓涓璞$殑鐘舵侊紝鐒跺悗鎵嶈瀹冨幓宸ヤ綔銆傝屽簲璇ュ憡涔嬪璞″浣曞幓宸ヤ綔銆傝繖灝辨剰鍛崇潃涔嬪墠鎵鏈夌殑閭d簺If渚嬪瓙搴旇鍙樹負(fù)錛?/span>
mobile.alert();
鍜?/span>
mobile.registerGasReading();
鍜?/span>
mobile.sendTextMessage();
鍜?/span>
mobile.notifyLocation();
鐜板亣璁鵑亶甯冭紼嬪簭涓殑涓浜汭f璇彞鍧楁湁閲嶅鐨勫疄鐜般傚湪"閲嶉噺綰f"鐗堟湰鐨勭▼搴忎腑錛屽彲鑳藉緢闅懼彂鐜板畠浠紱浣嗗湪"鍛婁箣鑰岄潪闂箣"鐗堟湰鐨勭▼搴忎腑錛屾墍鏈夌殑瀹炵幇閮藉湪Mobile涓傛墍鏈夌殑瀹炵幇閮藉湪涓澶勶紝榪欏氨渚夸簬瀵熻騫舵牴闄ら棶棰樸?br />     鍊懼惉浣犵殑嫻嬭瘯紼嬪簭涔熻兘甯姪浣犱繚鎸佷唬鐮佺殑綆媧併?/span>
public interface Alarm {
  
void alert(Mobile mobile);
}

public class Siren implements Alarm {
  
public void alert(Mobile mobile) {
    
if (mobile.getType == MobileTypes.STANDARD) {
      soundSiren();
    }
  }
}

public class TestSiren extends TestCase {
  
public void test_alert() {
    LocationMobile mobile 
= new LocationMobile();
    Siren siren 
= new Siren();
    siren.alert(mobile);
    
assert(sirenSounded());
  }
}
濡傛灉浣犲瘑鍒囧湴鍊懼惉嫻嬭瘯紼嬪簭錛屽畠鍙兘浼?xì)闂綘锛?涓轟粈涔堜綘闇瑕佷竴涓狶ocationMobile鍘繪祴璇昐iren鍛紵"鐨勭‘錛屼負(fù)浠涔堝憿錛熺湅璧鋒潵錛孲iren搴旇榪樹笉鐭ラ亾LocationMobile鍚с?/span>
public class LocationMobile {
  
private Alarm alarm;
  
public LocationMobile(Alarm alarm) {
    
this.alarm = alarm;
  }
  
public void alert() {
    alarm.alert(); 
// alert on Alarm no longer needs a mobile
  }
}

public class TestLocationMobile() extends TestCase {
  
public void test_alert() {
    Alarm alarm 
= EasyMock.createMock(Alarm.class);
    alarm.alert();
    EasyMock.replay(alarm);
    Mobile mobile 
= new LocationMobile(alarm);
    mobile.alert();
    EasyMock.verify(alarm);
}
濂藉儚鎴戝彧鏄氦鎹簡渚濊禆鍏崇郴銆侫larm涓嶅啀渚濊禆Mobile錛岀幇鍦ㄦ槸Mobile渚濊禆Alarm銆備絾濡傛灉浣犱粩緇嗗湴瑙傚療榪欎釜嫻嬭瘯紼嬪簭錛屼綘浼?xì)鍙戠幇鐪熸鐨勪緷璧栧叧绯绘槸锛孲iren鐭ユ檽浜哃ocationMobile銆備竴涓叿浣撶被渚濊禆鍙︿竴涓叿浣撶被錛岃繖榪濆弽浜?a >渚濊禆鍙嶈漿鍘熷垯(DIP)銆傜浜屼釜渚嬪瓙灝辮LocationMobile渚濊禆Alarm鎺ュ彛銆傚叿浣撶被渚濊禆鎶借薄錛岃繖灝辨弧瓚矰IP浜嗐?br />     濡傛灉浣犱嬌鐢═DD錛屽茍閬靛驚綆鍗曟硶鍒欏拰鍛婁箣鑰岄潪闂箣鍘熷垯鍘葷紪鍐欐墍鏈夌殑浠g爜錛屼綘灝卞浜庢垚涓轟竴涓洿濂界殑闈㈠悜瀵硅薄紼嬪簭鍛樼殑閬撹礬涓婁簡銆傚ソ鐨勯潰鍚戝璞′唬鐮佹槗浜庨槄璇誨拰緇存姢錛屼絾闅句互緙栧啓錛岃嚦灝戯紝鍦ㄥ紑濮嬫椂鏄繖鏍風(fēng)殑銆備綘鍐欑殑瓚婂錛屼綘灝變細(xì)鍙樺緱瓚婂ソ錛屼篃浼?xì)鑾峰緱鏇村鐨劸l忛獙銆傚悓鏃訛紝榪欎簺瀹炶返緇忛獙涔熶細(xì)浣夸綘鍦ㄨ嚜宸辯殑閬撹礬涓婂彈鐩婂尓嫻呫?br />
璇戞敞
[1]GodClass(涓婂笣綾?鎸囧寘鍚簡澶鍐呭鐨勭被銆?br />


Sha Jiang 2008-10-07 17:06 鍙戣〃璇勮
]]>
浣曟椂緙栧啓鍗曞厓嫻嬭瘯錛?璇?http://www.tkk7.com/jiangshachina/archive/2008/06/09/206812.htmlSha JiangSha JiangMon, 09 Jun 2008 12:55:00 GMThttp://www.tkk7.com/jiangshachina/archive/2008/06/09/206812.htmlhttp://www.tkk7.com/jiangshachina/comments/206812.htmlhttp://www.tkk7.com/jiangshachina/archive/2008/06/09/206812.html#Feedback2http://www.tkk7.com/jiangshachina/comments/commentRss/206812.htmlhttp://www.tkk7.com/jiangshachina/services/trackbacks/206812.html浣曟椂緙栧啓鍗曞厓嫻嬭瘯錛?/span>
    鏄湪緙栧啓涓涓柟娉曚箣鍓嶅氨緙栧啓瀹冪殑鍗曞厓嫻嬭瘯錛岃繕鏄湪鍐欏畬榪欎釜鏂規(guī)硶錛岀敋鑷蟲槸鏁翠釜綾諱箣鍚庢墠緙栧啓鍗曞厓嫻嬭瘯鍛紵John Ferguson Smart[1]鍦ㄤ粬鐨?a >blog涓啀嬈℃彁鍑轟簡榪欎釜闂錛屽茍鏍規(guī)嵁鑷繁鐨勭粡楠岀粰鍑轟簡涓浜涘緩璁?2008.06.10鏈鍚庢洿鏂?

    閮藉埆涔︾敓鎰忔皵浜嗐傚湪浣犵紪鍐欎竴涓柟娉曚箣鍓嶆垨鏄箣鍚庣紪鍐欏崟鍏冩祴璇?-鏍規(guī)嵁鎴戠殑緇忛獙錛屽彧瑕佷綘鍦ㄧ紪鍐欎唬鐮佺殑鍑犱箮鍚屾椂灝辮冭檻騫剁紪鍐欏崟鍏冩祴璇曠▼搴忥紝閭d箞榪欏氨鏃犲叧绱ц浜嗐傝繃鍚庡啀榪斿洖鍘?鎴栬呮牴鏈氨涓嶅洖鍘?鍐欐祴璇曠▼搴忓皢瀵艱嚧闂銆傚氨鎴戜釜浜鴻岃█錛屾垜鍠滄鍦ㄧ紪鍐欏皯閲忎唬鐮佷箣鍓嶆垨绱ф帴鐫鐨勪箣鍚庡氨緙栧啓鍗曞厓嫻嬭瘯--榪欎笉浼?xì)鎵撶牬宸ヤ綔娴伣E嬶紝鍥犱負(fù)瀹冨氨鏄祦紼嬬殑涓閮ㄥ垎銆?br />     榪欓渶瑕佷竴鐐瑰効瀹炶返緇忛獙--緙轟箯緇忛獙鐨勫紑鍙戣呯粡甯鎬負(fù)瑕佸啓浠涔堟牱鐨勬祴璇曠▼搴忚岀儲(chǔ)鎭箋備絾榪欏彲鑳戒篃鍙嶆槧鍑轟竴涓簨瀹烇細(xì)浠栦滑鍚屾牱涔熶笉鐭ラ亾瑕佸啓浠涔堟牱鐨勪唬鐮併備竴浜涗漢璇勮TDD鑳藉榧撳姳榪涜寰璁?-涓縐嶉潪甯稿簳灞傜殑璁捐錛屽畠涓嶉渶瑕佽冭檻杈冨ぇ鐨勫満鏅傝繖浼?xì)鍙戠敓鍦ň~轟箯緇忛獙鐨勫紑鍙戣呰韓涓婏紱濡傛灉浣犳暀鏉¤埇鍦板簲鐢ㄨ繖縐嶆柟娉曪紝鍚屾牱涔熶細(xì)閬囦笂銆傚儚琛屼負(fù)椹卞姩寮鍙戣繖鏍風(fēng)殑鏂規(guī)硶鍦ㄦ澶勫氨浼?xì)寰堥厳鱻傚綋浣犲湪鍐檊etter鏂規(guī)硶涔嬪墠錛屼綘浼?xì)鍐欎竴涓拡瀵硅繖涓猤etter鏂規(guī)硶鐨勫崟鍏冩祴璇曞悧錛熷鏋滄槸鐨勮瘽錛岄偅涔堜綘鐨勫崟鍏冩祴璇曚笓娉ㄧ殑灞傛灝辮緝楂樹簡錛屼篃浼?xì)鏇存帴杩戜簬鐢ㄦ?鎴栫郴緇?鐨勯渶姹傘?br />     鍥炲埌闂鐨勬湰璐紝涓轟粈涔堟垜鍠滄鎶婂崟鍏冩祴璇曟斁鍦ㄦ渶寮濮嬬殑浣嶇疆錛熷緢綆鍗曪紒鎴戠殑瀹炶返緇忛獙鍛婅瘔鎴戯紝閭f牱鍙互甯姪鎻愰珮浠g爜鐨勮川閲忥紝騫朵笖鑺傜害璋冭瘯鏃墮棿銆傚湪寮濮嬫椂鍐欏崄涓皬鐨勫崟鍏冩祴璇曟墍鑺辯殑鏃墮棿姣斿湪浠ュ悗淇Bug鎵鑺辯殑鏃墮棿瑕佸皯錛屽鏋滀唬鐮佺粡榪囦簡姝g‘鐨勫崟鍏冩祴璇曪紝閭e氨涓嶄細(xì)鏈塀ug浜嗐?br />     浜嬪疄涓婏紝鎴戝薄灞¤鍒幫紝濡傛灉鏌愪簺浠g爜緇忚繃浜嗛傚綋鐨勫崟鍏冩祴璇曪紝閭d箞灝變笉浼?xì)鏈壘~栫爜闂銆傛渶榪戝氨鏈変竴涓緥瀛愶細(xì)鑺變簡涓涓皬鏃剁殑鏃墮棿鍘繪悳瀵籛eb搴旂敤涓殑涓涓棶棰橈紝璇ラ棶棰樺嚭鐜板湪涓涓紪鍐欐紜殑Spring-MVC紼嬪簭涓傜粨鏋滄槸鐢變簬涓涓楠屽櫒綾誨拷鐣ヤ簡涓涓紓甯搞傚緢瀹規(guī)槗灝卞彂鐜頒簡榪欎釜闂錛屽疄闄呬笂錛屽湪鐪嬩簡浠g爜(浠g爜媯(gè)鏌?Code Review)涔熷緢鏈夋晥)涔嬪悗绔嬪埢灝卞彂鐜頒簡銆備絾鍏抽敭鏄紝鎴戜滑鑺變簡涓涓皬鏃剁敋鑷蟲洿澶氱殑鏃墮棿鍘繪壘榪欎釜闇瑕佽繘琛屾鏌ョ殑綾匯傚鏋滆繖浜涗唬鐮佺粡榪囦簡閫傚綋鐨勬祴璇曪紝閭d箞灝辮兘寰堝揩鍦板彂鐜板茍瑙e喅榪欎釜闂銆?br />     鏍規(guī)嵁鎴戠殑緇忛獙錛屽綋浜轟滑鍦ㄧ紪鍐欏畬紼嬪簭涔嬪悗鎵嶅紑濮嬬紪鍐欏崟鍏冩祴璇曪紝灝卞鍚屼簨鍚庢墠鏈夎繖鏍風(fēng)殑鎯蟲硶錛屼粬浠緢闅懼啓鍑鴻繖浜涙祴璇曚簡 ("鎴戝凡緇忓畬鎴愪簡鎵鏈夌殑浠g爜錛屾鏃舵垜榪樺緱鍘誨啓鍗曞厓嫻嬭瘯")銆傛垨鑰呮牴鏈氨涓嶅幓鍋氥傚湪榪欑鎯呭喌涓嬶紝浠g爜鏄惁瀹屾垚浜嗗憿錛熷鏋滀唬鐮佽繍琛屽湴寰堝ソ錛岄偅灝辯畻鏄畬鎴愪簡銆傝繖鏍風(fēng)殑璇濓紝鍐嶅啓鍗曞厓嫻嬭瘯灝卞ぇ澶у湴涓уけ浜嗗畠鐨勪環(huán)鍊箋傝繕涓嶄粎濡傛錛屼簨鍚庣紪鍐欑殑鍗曞厓嫻嬭瘯灝嗘槸鑲ゆ祬鐨勶紝涓嶄細(xì)瀵逛唬鐮佽繘琛岃壇濂藉湴嫻嬭瘯銆傛垨鑰咃紝寮鍙戣呭凡緇忚楀畬浜嗘椂闂達(dá)紝浠栦滑鏍規(guī)湰灝變笉鎯沖啀涓哄崟鍏冩祴璇曚激紲炰簡銆?br />     TDD涓庝換浣曞叾瀹冪殑緙栫爜瀹炶返涓鏍楓傚綋浣犳鍦ㄥ涔?fàn)鏌愪釜鏂扮殑鎶鏈椂錛屼綘浼?xì)鍊懼悜浜庡瀛︿範(fàn)鎸囧浜︽浜﹁秼銆傜被浼煎湴錛屽綋浣犲涔?fàn)涓欏規(guī)鏈椂錛屼綘涔熶細(xì)璇曠潃涓姝ユ鍦版ā浠垮ぇ甯堢殑鍔ㄤ綔錛岃屼笉蹇呭幓鐞嗚В鍏朵腑鐨勯昏緫銆備竴鏃︿綘鐔熸?zhèn)変簡鏌愪釜鎶鏈紝鑳藉鐔熺粌鍦頒嬌鐢ㄥ畠錛屽茍瀵瑰畠鏈変簡鏇存繁鍏ュ湴鐞嗚В錛?em>鐒跺悗錛屼綘灝辮兘鏀硅繘瀹冿紝騫朵笌浣犱箣鍓嶆帉鎻$殑鍏跺畠鎶鏈繘琛屾憾鍚堜簡銆?br />
璇戞敞
[1]John鏄?a >Java Power Tools涓涔︾殑涓諱綔鑰咃紝涔熸槸java.net涓竴浣嶆椿璺冪殑Blogger銆?br />
璇戝悗
    涓婂懆鍦╦ava.net涓婄湅鍒拌繖綃嘊log錛屽啀鑱旀兂鍒拌嚜宸卞湪騫蟲椂宸ヤ綔涓殑鍗曞厓嫻嬭瘯瀹炶返錛屾湁浜涙劅瑙︼紝鏁呭皢鍏剁炕璇戜簡鍑烘潵錛屼笌澶у鍏變韓銆?br />     浜嬪厛灝辯紪鍐欏崟鍏冩祴璇曪紝榪樻槸浜嬪悗鎵嶇紪鍐欏崟鍏冩祴璇曪紵榪欐槸涓涓侀棶棰樸傛寜鐓DD鐨勬濇兂錛岃嚜鐒舵槸瑕佸厛緙栧啓鍗曞厓嫻嬭瘯錛岀劧鍚庡啀緙栧啓鑳藉閫氳繃璇ュ崟鍏冩祴璇曠殑鏂規(guī)硶銆?br />     浣嗭紝鍗曞厓嫻嬭瘯騫朵笉鏄疶DD鐨勪笓灞為鍦幫紝寰堝涓嶅疄璺礣DD鐨勯」鐩篃鍦ㄥ簲鐢ㄧ潃鍗曞厓嫻嬭瘯銆?br />     鎴戣涓猴紝鍦ㄤ笉瀹炶返TDD鐨勯」鐩腑(鎴戣嚜宸辨墍澶勭殑鐜?yōu)鏄姝?錛屼簨鍚庣紪鍐欏崟鍏冩祴璇曚粛鏈夌潃鍏跺悎鐞嗘э細(xì)
    1. 浠ユ秷鏋佺殑鎬佸害鏉ョ湅錛屾棦鐒墮」鐩湰韜笉涓ユ牸瑕佹眰浜嬪厛緙栧啓鍗曞厓嫻嬭瘯錛岄偅涔堝氨鍙互鍦ㄤ簨鍚庡幓鍋氫簡銆傝繖鑷沖皯姣斾笉鍘誨仛瑕佸ソ錛岃亰鑳滀簬鏃犲槢銆?鍢垮樋錛屾槸澶熸秷鏋佺殑錛屼絾涔熸嬁浣犳病鍔炴硶)
    2. 浜嬪悗緙栧啓鍗曞厓嫻嬭瘯鑷沖皯涔熸槸涓縐嶆楠屾墜孌碉紝褰撶劧錛岃偗瀹氭瘮涓嶄笂浜嬪厛緙栧啓鐨勫崟鍏冩祴璇曘傚洜涓猴紝浜嬪悗緙栧啓鐨勫崟鍏冩祴璇曞緢鍙兘浼?灝嗗氨"宸茬粡鍐欏ソ鐨勫簲鐢ㄧ▼搴忥紝姝eJohn鎵璇?浜嬪悗緙栧啓鐨勫崟鍏冩祴璇曞皢鏄偆嫻呯殑錛屼笉浼?xì)瀵逛唬鐮仒q涜鑹ソ鍦版祴璇?銆備絾...浠嶇劧鏄亰鑳滀簬鏃犲槢 :-D (鍝堝搱錛屾湁瀹屾病瀹屼簡)
    3. 鍙互鎶婂崟鍏冩祴璇曪紝鍏朵腑灝卞寘鍚簨鍚庡崟鍏冩祴璇曪紝浣滀負(fù)"鍚庢潵鑰?浜嗚В銆佸涔?fàn)搴旂敤绋嬪簭鐨勬墜娈点傚洜涓哄崟鍏冩祴璇曠▼搴忓氨鏄簲鐢ㄧ▼搴忕殑"瀹㈡埛"錛屾墍浠ユ棤璁哄畠鏄簨鍏堝啓鐨勶紝榪樻槸浜嬪悗鍐欑殑錛岄兘鑳藉琛ㄧ幇鍑哄簲鐢ㄧ▼搴忕殑琛屼負(fù)銆?br />     4. 浜嬪悗鍗曞厓嫻嬭瘯錛屼篃鍙兘杞寲涓轟簨鍏堝崟鍏冩祴璇曘傚湪搴旂敤紼嬪簭鐨勬暣涓敓鍛藉懆鏈熶腑錛岀淮鎶ら樁孌墊槸鏈闀跨殑銆傚湪"婕暱"鐨勭淮鎶よ繃紼嬩腑錛?涔嬪墠"鎵鍐欑殑"浜嬪悗"鍗曞厓嫻嬭瘯灝嗕細(xì)鎴愪負(fù)"鍚庢潵鑰?(鍖呮嫭鍘熷浣滆呮湰浜?鐨?浜嬪厛"鍗曞厓嫻嬭瘯銆傚湪鏀硅繘紼嬪簭鐨勮繃紼嬩腑錛岃繖浜涘崟鍏冩祴璇曚粛鐒惰兘璧峰埌鐩戠潱鐨勪綔鐢ㄣ?orz錛屾湁鐐瑰効璇¤京)
    铏界劧錛屼簨鍚庡崟鍏冩祴璇曟槑鏄句笉濡備簨鍏堝崟鍏冩祴璇曪紝浣嗗畠鐨勪綔鐢ㄤ粛鐒朵笉鍙綆浼般傚彧瑕佺紪鍐欎簡浼樼鐨勫崟鍏冩祴璇曠▼搴忥紝鏃犺鏄湪鍝釜闃舵錛屽畠閮戒細(xì)瀵規(guī)敼榪涘簲鐢ㄧ▼搴忔湁鑾ぇ鐨勫府鍔┿?榪欏彲涓嶆槸"鑱婅儨浜庢棤"鑳藉琛ㄨ揪鐨?



Sha Jiang 2008-06-09 20:55 鍙戣〃璇勮
]]>
主站蜘蛛池模板: 免费在线观看a级毛片| 免费国产黄网站在线观看动图| 亚洲人成国产精品无码| 午夜性色一区二区三区免费不卡视频 | 免费一看一级毛片全播放| 免费看片在线观看| 成人影片一区免费观看| 色哟哟国产精品免费观看| 亚洲AV成人精品一区二区三区| 亚洲午夜电影在线观看| 91亚洲va在线天线va天堂va国产| 91麻豆精品国产自产在线观看亚洲 | 免费鲁丝片一级在线观看| 中文字幕免费在线看线人| 99re6在线精品视频免费播放| 国产精品内射视频免费| 尤物视频在线免费观看| 校园亚洲春色另类小说合集| 亚洲中文字幕无码爆乳| 亚洲最大的黄色网| 亚洲AV色吊丝无码| 激情综合亚洲色婷婷五月APP| 亚洲国产中文在线视频| 亚洲精品中文字幕乱码| 亚洲综合久久成人69| 亚洲美女视频网站| 亚洲女人初试黑人巨高清| 亚洲精品中文字幕乱码影院| 亚洲精品人成电影网| 亚洲不卡中文字幕| 亚洲最大成人网色香蕉| 亚洲综合av一区二区三区不卡 | 波多野结衣在线免费观看| 免费AA片少妇人AA片直播| 久久精品免费全国观看国产| 99久久综合国产精品免费| 国色精品卡一卡2卡3卡4卡免费| 99无码人妻一区二区三区免费| 一本岛高清v不卡免费一三区| 中国在线观看免费国语版| 午夜免费福利网站|