锘??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲综合一区二区精品久久,老司机亚洲精品影院,亚洲欧洲国产经精品香蕉网http://www.tkk7.com/BaoquanInside/鐮旂┒java銆乯2ee鍜孡ucenezh-cnSun, 11 May 2025 11:23:27 GMTSun, 11 May 2025 11:23:27 GMT60嫻嬭瘯椹卞姩寮鍙戞渚嬩箣鑷姩鍞揣鏈猴紙絎?闆嗭級http://www.tkk7.com/BaoquanInside/archive/2006/02/25/32458.htmlBaoquan InsideBaoquan InsideSat, 25 Feb 2006 15:12:00 GMThttp://www.tkk7.com/BaoquanInside/archive/2006/02/25/32458.htmlhttp://www.tkk7.com/BaoquanInside/comments/32458.htmlhttp://www.tkk7.com/BaoquanInside/archive/2006/02/25/32458.html#Feedback3http://www.tkk7.com/BaoquanInside/comments/commentRss/32458.htmlhttp://www.tkk7.com/BaoquanInside/services/trackbacks/32458.html嫻嬭瘯椹卞姩寮鍙?TDD, Test Driven Development)鏄竴縐嶅緢鏈夋剰鎬濈殑杞歡寮鍙戞柟寮忥紝鏈泦浠ヨ緝?yōu)畯鐨勬浼愪綋楠孴DD銆?BR>
/**  A program simulation of an automat.
 *
 *  Director: Zuo Baoquan
 *  Contact me:
 *     Blog:   http://www.tkk7.com/BaoquanInside
 *     MSN: Baoquan.Zuo [at] hotmail.com
 *     Email:  Baoquan.Zuo [at] gmail.com
 *
 *  Copyright 2006 BEC Studio
 */
 
寮曡█錛?/DIV>
錛堣闂鎴彇鑷?A >闈㈠悜瀵硅薄鐨勮璁′笌妯″紡銆?Written by Cay Horstmann) Exercise 2.18
 
璁捐騫跺疄鐜頒竴涓ā鎷熻嚜鍔ㄥ敭璐ф満鐨勭▼搴忋傞氳繃緇欐満鍣ㄦ姇鍏ユ紜殑紜竵錛屼究鍙互璐拱鍒扮浉搴旂殑鍟嗗搧銆傜敤鎴蜂粠涓涓彲鐢ㄧ殑鍟嗗搧鍒楄〃涓夋嫨鍟嗗搧銆佹姇鍏ョ‖甯佸茍寰楀埌鍟嗗搧銆傚鏋滄病鏈夎凍澶熺殑閽卞竵鎴栫敱浜庢鍟嗗搧宸查攢鍞畬姣曪紝鍒欏皢紜竵閫鍥炪傛搷浣滃憳鍙互閲嶆柊澶?STRONG>璐?/STRONG>騫跺皢閽卞竵鍙栬蛋銆?/DIV>
 
 
鍦烘櫙#1
鍦扮偣錛氬悓嫻庡ぇ瀛﹁タ鍗楁ゼ
娑変紬錛氭垜錛岀┖鑷姩鍞揣鏈?/DIV>
 
瀵濆妤奸噷闈㈠垰鎼潵浜嗕竴鍙扮┖鐨勮嚜鍔ㄥ敭璐ф満錛岄偅鎴戜滑鏉ユ祴璇曚竴涓嬶細
 
public class TestEmptyAutomat extends TestCase
{
  public void testIsEmpty()
  {
    Automat automat = new Automat(); 
    assertTrue("it should be empty.", automat.isEmpty());
  }
}
 
Eclipse鎻愮ず"Automat cannot be resolved to a type"錛屽ソ錛岀湅鎴戠殑錛?/DIV>
public class Automat
{
  public Automat()  // constructor stub
  {
  }
}
 
鍐嶉湶涓鎵嬶細
//class Automat
public boolean isEmpty()
{
  return true;
}
 
鍏ㄩ儴淇濆瓨錛岃繍琛屾祴璇曪紝鍛靛懙錛岀豢鑹茶繘搴︽潯錛佹祴璇曟垚鍔燂紒
 
濂斤紝鏃㈢劧鎴戜滑榪樻病鏈夋姇榪囩‖甯侊紝閭d箞浣欓搴旇鏄?浜嗭綖
 
// class TestEmptyAutomat
public void testBalance()
{
  Automat automat = new Automat();
  assertEquals("the balance should be 0.", 0, automat.balance); 
}
 
緇х畫浣跨敤鎴戜滑鐨勬硶瀹濓細
// class Automat
public final int balance = 0;
 
榪愯嫻嬭瘯錛寉eah!
 
鐪嬩簡涓閬嶆祴璇曠▼搴忥紝鍐沖畾浼樺寲涓涓嬶細
public class TestEmptyAutomat extends TestCase
{
  protected void setUp() throws Exception
  {
    super.setUp();
    automat = new Automat();
  }
 
  public void testIsEmpty()
  {
    assertTrue("it should be empty.", automat.isEmpty());
  }
 
  public void testBalance()
  {
    assertEquals("the balance should be 0.", 0, automat.balance); 
  }
 
  private Automat automat;
}
鍐嶈繍琛屼竴嬈℃祴璇曪紝鍛靛懙錛屽張鏄豢鑹詫紒
 
鍦烘櫙#2
鍦扮偣錛氬悓嫻庡ぇ瀛﹁タ鍗楁ゼ
娑変紬錛氭垜錛岃嚜鍔ㄥ敭璐ф満(鏈変竴鐡剁櫨浜嬪彲涔?
 
濂芥秷鎭紝妤奸暱鍦ㄨ嚜鍔ㄥ敭璐ф満閲岄潰鏀句簡涓鐡禤epsi銆?/DIV>
 
public class TestAutomatWithOnePepsi extends TestCase
{
  protected void setUp() throws Exception
  {
    super.setUp();
    automat = new Automat();
    pepsi = new Pepsi();  // 涓鐡剁櫨浜嬪彲涔?/DIV>
    automat.add(pepsi);  // 妤奸暱闃垮Ж鏀劇殑锝?BR>  }
  
  public void testEmpty()
  {
    assertFalse("it should not be empty.", automat.isEmpty());
  }
 
  public Automat automat;
  public Pepsi pepsi;
}

鎺ョ潃鍒涘緩Pepsi綾?/DIV>
 
public class Pepsi
{
  public Pepsi() // constructor stub
  {
   
  }
}
 
鍐嶇粰Automat娣誨姞add鏂規(guī)硶錛?/DIV>
// class Automat
public void add(Pepsi pepsi)
{
 
}
 
濂斤紝鐜板湪鏈変袱涓猅C(Test Case)浜嗭紝涓轟簡榪愯涓や釜嫻嬭瘯妗堜緥錛屾垜浠潵鍒涘緩涓涓猅est Suite:
public class AutomatTests
{
  public static Test suite()
  {
    TestSuite suite = new TestSuite("Test for net.mybec.automat");
    //$JUnit-BEGIN$
    suite.addTestSuite(TestAutomatWithOnePepsi.class);
    suite.addTestSuite(TestEmptyAutomat.class);
    //$JUnit-END$
   
    return suite;
  }
}
 
緙栬瘧鎴愬姛錛岃繍琛孉utomatTests錛岀孩鑹茶繘搴︽潯銆俆estEmptyAutomat緇胯壊錛孴estAutomatWithOnePepsi綰㈣壊銆傚懙鍛碉紝鐪嬫潵瑕佽add鍋氱偣浜嬫儏浜嗐?/DIV>
 
// class Automat
public void add(Pepsi pepsi)
{
  goods.add(pepsi);
}
 
// 娣誨姞涓涓Pepsi鐨勬暟緇勫垪琛?/DIV>
private final ArrayList<Pepsi> goods = new ArrayList<Pepsi>();

 
// 淇敼isEmpty鏂規(guī)硶
public boolean isEmpty()
{
  return goods.isEmpty();
}

 
鍐嶆榪愯AutomatTests錛屽懙鍛碉紝緇胯壊錛佹垜浠枩嬈紒
 
濂斤紝鎴戜滑鍐嶇湅鐪婣utomat鐨勪綑棰濓細
 
// class TestAutomatWithOnePepsi
public void testBalance()
{
  assertEquals("the balance should be 0.", 0, automat.balance);
}
 
榪愯涓閬嶆祴璇曪紝Ok銆?/DIV>
 
 
鎴戜滑榪樻病鏈夋姇紜竵錛屽綋鐒朵笉鑳戒拱鐧句簨鍙箰浜嗭細
 
// class TestAutomatWithOnePepsi
public void testCanBuyWithoutBalance()
{
  assertFalse("we cannot buy pepsi without money.", automat.canBuy(pepsi));
}
// class Automat
public boolean canBuy(Pepsi pepsi)
{
  return false;
}
 
鎴戜滑澶枩嬈㈣繍琛屾祴璇曚簡錛屼簬鏄張蹇嶄笉浣忚繍琛屼簡鎵鏈夌殑鑷姩嫻嬭瘯錛堝懙鍛碉紝瀹為檯涓婃垜浠彧闇瑕佺偣鍑諱竴涓繍琛屾寜閽級銆傚張鏄豢鑹詫綖
 
濂斤紝濡傛灉Pepsi鐨勪環(huán)鏍兼槸2鍏冿紝鎴戜滑鎶?鍧楅挶璇曡瘯锝?/DIV>
 
// class Pepsi
public static final int PRICE = 2;
 
// class TestAutomatWithOnePepsi
public void testCanBuyWithOneYuan()
{
  automat.put(1);
  assertFalse("we cannot buy pepsi with one yuan.", automat.canBuy(pepsi));
}
 
// class Automat
public void put(int yuan)
{
 
}
 
榪愯嫻嬭瘯錛岀豢鑹層傛樉鐒?鍧楅挶涔頒笉鍒扮櫨浜嬪彲涔愩傞偅灝辨姇2鍧楅挶鍚э細
 
// class TestAutomatWithOnePepsi
public void testCanBuyWithTwoYuan()
{
  automat.put(2);
  assertTrue("we can not buy pepsi with two yuan.", automat.canBuy(pepsi));
}
 
榪愯嫻嬭瘯錛岀孩鑹茶繘搴︽潯錛?A >JUnit鎻愮ず鈥渨e can not buy pepsi with two yuan.鈥?澶╁晩錛岃繖涓嶅叕騫熾?/DIV>
鎯寵搗鏉ヤ簡錛孉utomat.put浠涔堜篃娌″仛銆備簬鏄垜浠坊浜嗗嚑絎旓細
 
// class Automat
public void put(int yuan)
{
  balance += yuan;
}
 
public boolean canBuy(Pepsi pepsi)
{
  return balance >= Pepsi.PRICE;
}
 
public int balance = 0;  // 鍘繪帀浜唂inal
 
榪笉鍙婂緟鍦扮偣鍑諱簡榪愯鎸夐挳錛寉eah錛佺粓浜庤兘涔板埌鍠滄鐨凱epsi浜嗭紙鍥犱負鐪嬪埌浜嗙豢鑹茶繘搴︽潯锝烇級銆?/DIV>
 
浜庢槸鎬ュ繖涔頒簡涓鐡禤epsi錛?/DIV>
// class TestAutomatWithOnePepsi
public void testBuyPepsiWithTwoYuan()
{
  automat.put(2);
  automat.buy(pepsi);
  assertTrue("the automat should be empty.", automat.isEmpty());
}
// class Automat
public void buy(Pepsi pepsi)
{
 
}
 
Run Tests, Failed. So,
// class Automat
public void buy(Pepsi pepsi)
{
  goods.remove(pepsi);
}
Run Tests again, OK.
 
 
// class TestAutomatWithOnePepsi
public void testBuyPepsiWithTwoYuan()
{
  automat.put(2);
  automat.buy(pepsi);
  assertTrue("the automat should be empty.", automat.isEmpty());
  assertEquals("the balance should be 0.", 0, automat.balance);
}
Run Tests, failed, so
 
// class Automat
public void buy(Pepsi pepsi)
{
  goods.remove(pepsi);
  balance -= Pepsi.PRICE;
}
Run Tests again, OK.
 
閭e鏋滄病鏈夋姇甯佸氨鐩存帴涔癙epsi鍛紵鍐嶆坊鍔犱竴涓祴璇曪細
 
// class TestAutomatWithOnePepsi
public void testBuyPepsiWithNoBalance()
{
  try
  {
    automat.buy(pepsi);
    fail("a NoBalanceException was expected when buying a pepsi with no balance.");
  }
  catch (NoBalanceException e)
  {
  }
}
 
 
// class NoBalanceException
public class NoBalanceException extends Exception
{
  public NoBalanceException(String arg0)
  {
    super(arg0);
  }
}
 
 
// class TestAutomatWithOnePepsi
public void testBuyPepsiWithTwoYuan()
{
  automat.put(2);
  try
  {
    automat.buy(pepsi);
  }
  catch (NoBalanceException e)
  {
    fail("a NoBalanceException was throwed.");
  } 
  assertTrue("the automat should be empty.", automat.isEmpty()); 
  assertEquals("the balance should be 0.", 0, automat.balance);
 }

 
// class Automat
public void buy(Pepsi pepsi) throws NoBalanceException
{
  if (balance == 0)
    throw new NoBalanceException("No balance");
  else if (balance >= Pepsi.PRICE)
  {
    goods.remove(pepsi);
    balance -= Pepsi.PRICE;
  }
}
 
榪愯嫻嬭瘯錛岀豢鑹詫紒
鎺ヤ笅鏉ユ姇1鍧楅挶涔頒拱鐪嬶細
 
// class TestAutomatWithOnePepsi
public void testBuyPepsiWithOneYuan()
{
  automat.put(1);
  try
  {
    automat.buy(pepsi);
    fail("a LackOfBalanceException was expected when buying a pepsi without enough balance.");
  }
  catch (LackOfBalanceException e)
  {
  }
  catch (NoBalanceException e)
  {
    fail("a NoBalanceException was not expected.");
  }
}
鎺ヤ笅鏉ワ紝涓轟簡鑳戒嬌緙栬瘧閫氳繃錛屽仛浜嗕竴涓嬩慨鏀癸細
// class LackOfBalanceException
public class LackOfBalanceException extends Exception
{
  public LackOfBalanceException(String arg0)
  {
    super(arg0);
  }
}
// class Automat
public void buy(Pepsi pepsi) throws NoBalanceException, LackOfBalanceException
{
  // ...
}
 
// class TestAutomatWithOnePepsi
public void testBuyPepsiWithNoBalance()
{
  // ...
  catch (LackOfBalanceException e)
  {
    fail("a LackOfBalanceException was not expected.");
  }

}
 
public void testBuyPepsiWithTwoYuan()
{
  // ...
  catch (LackOfBalanceException e)
  {
    fail("a LackOfBalanceException was not expected.");
  } 
  // ...
}

濂斤紝娌℃湁閿欒鎻愮ず浜嗐傜紪璇戯紝榪愯嫻嬭瘯錛岀孩鑹茶繘搴︽潯銆?/DIV>
testBuyPepsiWithOneYuan()鎻愮ず鈥渁 LackOfBalanceException was expected when buying a pepsi with no enough balance."
 
鎴戜滑淇敼涓涓婣utomat.buy()錛?/DIV>
// class Automat
public void buy(Pepsi pepsi) throws NoBalanceException, LackOfBalanceException
{
  if (balance == 0)
  {
    throw new NoBalanceException("No balance");
  }
  else if (balance >= Pepsi.PRICE)
  {
    goods.remove(pepsi);
    balance -= Pepsi.PRICE;
  }
  else
    throw new LackOfBalanceException("Lack of Balance");
}
嫻嬭瘯閫氳繃浜嗭紒灝忓皬搴嗙涓涓嬶綖
 
閭e鏋滄垜浠姇浜嗕笁鍧楅挶鍛紵濂斤紝璇曡瘯鐪嬶細
 
// class TestAutomatWithOnePepsi
public void testBuyPepsiWithThreeYuan()
{
  automat.put(3);
  assertTrue("we can buy pepsi.", automat.canBuy(pepsi));  
  try
  {
    automat.buy(pepsi);
    assertTrue("the automat should be empty.", automat.isEmpty());
    assertEquals("the balance should be 1.", 1, automat.balance);
  }
  catch (Exception e)
  {
    fail("Exception was not expected.");
  }  
}
 
緙栬瘧錛岃繍琛屾祴璇曪紝鎴愬姛錛乊eah!
 
To be continued...
 
 
涓嬩竴闆嗗皢浼氭洿鍔犵簿褰╋紝鏁鏈熷緟銆?/DIV>


]]> 主站蜘蛛池模板: ww在线观视频免费观看w| 久久99热精品免费观看牛牛| 亚洲精品白浆高清久久久久久| 无码一区二区三区免费| 一本色道久久88—综合亚洲精品| 亚洲AV无码一区二区三区国产| 在线涩涩免费观看国产精品| 国产亚洲福利在线视频| 久久精品国产亚洲一区二区三区| 中文字幕视频免费| 日韩欧美亚洲中文乱码| 亚洲AV人无码综合在线观看| 免费看a级黄色片| 七色永久性tv网站免费看| 亚洲成av人片天堂网无码】| 亚洲高清在线视频| 国产公开免费人成视频| 最近中文字幕免费2019| 日本一区二区在线免费观看| 91亚洲性爱在线视频| 亚洲中文字幕无码永久在线| 免费无码又爽又高潮视频| 久久久久久国产精品免费免费男同| 亚洲av无码专区在线观看亚| 亚洲视频在线观看网站| 亚洲一级特黄大片在线观看| 最近最好的中文字幕2019免费| 免费国产成人午夜在线观看| 美女黄网站人色视频免费| 亚洲1区1区3区4区产品乱码芒果 | 亚洲国产福利精品一区二区| 亚洲一区二区三区偷拍女厕| 小小影视日本动漫观看免费| 精品国产无限资源免费观看| 国产一区二区三区免费| 日本永久免费a∨在线视频 | 光棍天堂免费手机观看在线观看| 精品亚洲福利一区二区| 亚洲一级大黄大色毛片| 91亚洲国产成人精品下载| 亚洲精品无码久久久影院相关影片 |