<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 156,  comments - 601,  trackbacks - 0
    關(guān)鍵字: TDD, Junit, Spring, Test

    本文從一個(gè)例子出發(fā),根據(jù)TDD(測試驅(qū)動(dòng)開發(fā))要求,進(jìn)行開發(fā)。只是用于演示如何使用Spring2.5提供的基于Annonation方式的IOC實(shí)現(xiàn),進(jìn)行TDD開發(fā)。

    首先我們來看一下這個(gè)例子的要求:
      開發(fā)一個(gè)購物車對(duì)象,可以添加商品,刪除商品,查詢已購商口,結(jié)賬功能。

    第一步,先來完成添加商品功能,下面就按TDD開發(fā)要求,先編寫單元測試:

    下面是增對(duì)該功能,編寫的測試代碼
     1 /**
     2  * @author xmatthew
     3  *
     4  */
     5 @RunWith(SpringJUnit4ClassRunner.class)
     6 @ContextConfiguration(locations = {"classpath:/applicationContext.xml"})
     7 @TestExecutionListeners({DependencyInjectionTestExecutionListener.class})
     8 public class CartTest {
     9 
    10     @Autowired
    11     private SuperStore superStore;
    12     
    13     @Test
    14     public void addCommodity() {
    15 
    16         Cart cart = new Cart();
    17         Commodity commodity = superStore.getCommodity("1"/*電腦桌*/);
    18         cart.addCommodity(commodity);
    19         
    20         Assert.assertEquals(1, cart.size());
    21         Assert.assertTrue(cart.contains(commodity));
    22         
    23     }
    24 }

    當(dāng)然這個(gè)單元測試不能通過(無法編譯).接下來就是編寫代碼,讓單元測試能順利通過
    添加 applicationContext.xml文件

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <beans xmlns="http://www.springframework.org/schema/beans"
     3        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     4        xmlns:context="http://www.springframework.org/schema/context"
     5        xsi:schemaLocation="http://www.springframework.org/schema/beans
     6            http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
     7            http://www.springframework.org/schema/context
     8            http://www.springframework.org/schema/context/spring-context-2.5.xsd">
     9 
    10  
    11     <context:component-scan base-package="com.xmatthew.spring.tdd"/>
    12     <context:annotation-config/>
    13 
    14  
    15 </beans>
    16 

    Commodity.java
     1 /**
     2  * @author xmatthew
     3  *
     4  */
     5 public class Commodity {
     6 
     7     private String id;
     8     private String name;
     9     private BigDecimal price;
    10     
    11     /* (non-Javadoc)
    12      * @see java.lang.Object#equals(java.lang.Object)
    13      */
    14     @Override
    15     public boolean equals(final Object other) {
    16         if (!(other instanceof Commodity))
    17             return false;
    18         Commodity castOther = (Commodity) other;
    19         return new EqualsBuilder().append(id, castOther.id).append(name,
    20                 castOther.name).append(price, castOther.price).isEquals();
    21     }
    22 
    23     /* (non-Javadoc)
    24      * @see java.lang.Object#hashCode()
    25      */
    26     @Override
    27     public int hashCode() {
    28         return new HashCodeBuilder().append(id).append(name).append(price)
    29                 .toHashCode();
    30     }
    31 
    32     public Commodity(String id, String name, BigDecimal price) {
    33         super();
    34         this.id = id;
    35         this.name = name;
    36         this.price = price;
    37     }
    38 
    39     public String getId() {
    40         return id;
    41     }
    42 
    43     public void setId(String id) {
    44         this.id = id;
    45     }
    46 
    47     public String getName() {
    48         return name;
    49     }
    50 
    51     public void setName(String name) {
    52         this.name = name;
    53     }
    54 
    55     public BigDecimal getPrice() {
    56         return price;
    57     }
    58 
    59     public void setPrice(BigDecimal price) {
    60         this.price = price;
    61     }
    62     
    63     
    64 }
    65 

    SuperStore.java
    1 /**
    2  * @author xmatthew
    3  *
    4  */
    5 public interface SuperStore {
    6 
    7     
    8     Commodity getCommodity(String id);
    9 }

    Cart.java
     1 /**
     2  * @author xmatthew
     3  *
     4  */
     5 public class Cart {
     6     
     7     List<Commodity> commodities = new LinkedList<Commodity>();
     8 
     9     public void addCommodity(Commodity commodity) {
    10         commodities.add(commodity);
    11         
    12     }
    13 
    14     public boolean contains(Commodity commodity) {
    15         // TODO Auto-generated method stub
    16         return commodities.contains(commodity);
    17     }
    18 
    19     public int size() {
    20         // TODO Auto-generated method stub
    21         return commodities.size();
    22     }
    23 
    24 }

     1 /**
     2  * @author xmatthew
     3  *
     4  */
     5 @Service
     6 public class WalMart implements SuperStore {
     7     
     8     private Map<String, Commodity> commodities;
     9 
    10     public WalMart() {
    11         super();
    12         commodities = new HashMap<String, Commodity>(3);
    13         commodities.put("1"new Commodity("1""電腦桌"new BigDecimal(1288)));
    14         commodities.put("2"new Commodity("2""電腦椅"new BigDecimal(588)));
    15         commodities.put("3"new Commodity("1""電腦包"new BigDecimal(368)));
    16     }
    17 
    18     public Commodity getCommodity(String id) {
    19         Assert.hasText(id, "id is null");
    20         return commodities.get(id);
    21     }
    22 
    23 }

    增加上面代碼,再運(yùn)行單元測試,測試通過。TDD的基本開方法就類似下面幾個(gè)步驟:
     * 編寫測試代碼
     * 運(yùn)行測試
     * 完善(重構(gòu))代碼
     * 再測試
     * 最終測試通過

    示例比較簡單,只是為了演示基于Spring2.5版本上如何進(jìn)行TDD開發(fā)。

    我看到在Spring2.5進(jìn)行代碼的測試變得非常簡單
    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(locations 
    = {"classpath:/applicationContext.xml"})
    @TestExecutionListeners({DependencyInjectionTestExecutionListener.
    class})
    上面的代碼,就可實(shí)現(xiàn)自動(dòng)加載Spring context

    @Autowired
    private SuperStore superStore;
    使用Spring的Configuration功能,自動(dòng)實(shí)現(xiàn)依賴注入。感謝Spring Configuration項(xiàng)目,讓IOC實(shí)現(xiàn)更簡單,方便。
     
    當(dāng)然不得不提的就是Junit4 測試框架給是給我們編寫單元簡化了很多。
    本文示例代碼下載

    Good Luck!
    Yours Matthew!


    posted on 2008-11-05 19:40 x.matthew 閱讀(1910) 評(píng)論(2)  編輯  收藏 所屬分類: Spring|Hibernate|Other framework
    主站蜘蛛池模板: 啦啦啦www免费视频| 亚州**色毛片免费观看| 1区1区3区4区产品亚洲| 国精无码欧精品亚洲一区 | 久久久久女教师免费一区| 日韩毛片在线免费观看| 美女被吸屁股免费网站| 青娱乐在线视频免费观看| 特黄aa级毛片免费视频播放| 狼色精品人妻在线视频免费| 一级毛片免费播放试看60分钟| 香蕉国产在线观看免费| 一级特级女人18毛片免费视频| japanese色国产在线看免费| 中国内地毛片免费高清| 最近免费mv在线观看动漫| 午夜老司机永久免费看片| 91福利视频免费| jjizz全部免费看片| 欧洲黑大粗无码免费| 麻豆成人精品国产免费| 亚洲?V乱码久久精品蜜桃 | 久久九九全国免费| 午夜免费啪视频在线观看| 亚欧色视频在线观看免费| 中文字幕av无码无卡免费| 免费高清av一区二区三区| 又粗又硬又黄又爽的免费视频| 中文字幕亚洲一区| 亚洲国产人成网站在线电影动漫 | 国产亚洲色视频在线| 国产亚洲综合色就色| 亚洲嫩草影院在线观看| 亚洲AV日韩AV永久无码色欲| 午夜在线免费视频 | 国产一级在线免费观看| 国产白丝无码免费视频| 国产卡二卡三卡四卡免费网址| 四虎成人免费观看在线网址| JLZZJLZZ亚洲乱熟无码| 色婷婷亚洲十月十月色天|