通过Spring2.5对单元测试的Annotation支持进行TDD开发

本文从一个例子出发,根据TDD(测试驱动开发)要求,进行开发。只是用于演示如何使用Spring2.5提供的基于Annonation方式的IOC实现,进行TDD开发。

    首先我们来看一下这个例子的要求:开发一个购物车对象,可以添加商品,删除商品,查询已购商口,结账功能。

    第一步,先来完成添加商品功能,下面就按TDD开发要求,先编写单元测试

    下面是增对该功能,编写的测试代码

/**
  * @author xmatthew
  *
  */
  @RunWith(SpringJUnit4ClassRunner.class)
  @ContextConfiguration(locations = {"classpath:/applicationContext.xml"})
  @TestExecutionListeners({DependencyInjectionTestExecutionListener.class})
  public class CartTest {
  
     @Autowired
     private SuperStore superStore;
     
     @Test
     public void addCommodity() {
 
         Cart cart = new Cart();
         Commodity commodity = superStore.getCommodity("1"/*电脑桌*/);
         cart.addCommodity(commodity);
         
         Assert.assertEquals(1, cart.size());
         Assert.assertTrue(cart.contains(commodity));
         
     }
 }
 1 /**

2*@authorxmatthew

3*

4*/

5@RunWith(SpringJUnit4ClassRunner.class)

6@ContextConfiguration(locations={"classpath:/applicationContext.xml"})

7@TestExecutionListeners({DependencyInjectionTestExecutionListener.class})

8publicclassCartTest{

9

10@Autowired

11privateSuperStoresuperStore;

12

13@Test

14publicvoidaddCommodity(){

15

16Cartcart=newCart();

17Commoditycommodity=superStore.getCommodity("1"/*电脑桌*/);

18cart.addCommodity(commodity);

19

20Assert.assertEquals(1,cart.size());

21Assert.assertTrue(cart.contains(commodity));

22

23}

24 }

    当然这个单元测试不能通过(无法编译)。接下来就是编写代码,让单元测试能顺利通过添加 applicationContext.xml文件

  

<?xml version="1.0" encoding="UTF-8"?>
 <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
            http://www.springframework.org/schema/context
            http://www.springframework.org/schema/context/spring-context-2.5.xsd">
 
  
     <context:component-scan base-package="com.xmatthew.spring.tdd"/>
     <context:annotation-config/>
 
  
 </beans>
 1 <?xml version="1.0" encoding="UTF-8"?>

2<beansxmlns="http://www.springframework.org/schema/beans"

3xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

4xmlns:context="http://www.springframework.org/schema/context"

5xsi:schemaLocation="http://www.springframework.org/schema/beans

6http://www.springframework.org/schema/beans/spring-beans-2.5.xsd

7http://www.springframework.org/schema/context

8http://www.springframework.org/schema/context/spring-context-2.5.xsd">

9

10

11<context:component-scanbase-package="com.xmatthew.spring.tdd"/>

12<context:annotation-config/>

13

14

15</beans>

16 

    Commodity.java

/**
  * @author xmatthew
  *
  */
 public class Commodity {
 
     private String id;
     private String name;
     private BigDecimal price;
     
     /* (non-Javadoc)
      * @see java.lang.Object#equals(java.lang.Object)
      */
     @Override
     public boolean equals(final Object other) {
         if (!(other instanceof Commodity))
             return false;
         Commodity castOther = (Commodity) other;
         return new EqualsBuilder().append(id, castOther.id).append(name,
                 castOther.name).append(price, castOther.price).isEquals();
     }
 
     /* (non-Javadoc)
      * @see java.lang.Object#hashCode()
      */
     @Override
     public int hashCode() {
         return new HashCodeBuilder().append(id).append(name).append(price)
                 .toHashCode();
     }
 
     public Commodity(String id, String name, BigDecimal price) {
         super();
         this.id = id;
         this.name = name;
         this.price = price;
     }
 
     public String getId() {
         return id;
     }
 
     public void setId(String id) {
         this.id = id;
     }
 
     public String getName() {
         return name;
     }
 
     public void setName(String name) {
         this.name = name;
     }
 
     public BigDecimal getPrice() {
         return price;
     }
 
     public void setPrice(BigDecimal price) {
         this.price = price;
     }
     
     
 }
 1 /**

2*@authorxmatthew

3*

4*/

5publicclassCommodity{

6

7privateStringid;

8privateStringname;

9privateBigDecimalprice;

10

11/*(non-Javadoc)

12*@seejava.lang.Object#equals(java.lang.Object)

13*/

14@Override

15publicbooleanequals(finalObjectother){

16if(!(otherinstanceofCommodity))

17returnfalse;

18CommoditycastOther=(Commodity)other;

19returnnewEqualsBuilder().append(id,castOther.id).append(name,

20castOther.name).append(price,castOther.price).isEquals();

21}

22

23/*(non-Javadoc)

24*@seejava.lang.Object#hashCode()

25*/

26@Override

27publicinthashCode(){

28returnnewHashCodeBuilder().append(id).append(name).append(price)

29.toHashCode();

30}

31

32publicCommodity(Stringid,Stringname,BigDecimalprice){

33super();

34this.id=id;

35this.name=name;

36this.price=price;

37}

38

39publicStringgetId(){

40returnid;

41}

42

43publicvoidsetId(Stringid){

44this.id=id;

45}

46

47publicStringgetName(){

48returnname;

49}

50

51publicvoidsetName(Stringname){

52this.name=name;

53}

54

55publicBigDecimalgetPrice(){

56returnprice;

57}

58

59publicvoidsetPrice(BigDecimalprice){

60this.price=price;

61}

62

63

64}

65 

    SuperStore.java

/**
  * @author xmatthew
  *
  */
 public interface SuperStore {
 
     
     Commodity getCommodity(String id);
 }
1 /**

2*@authorxmatthew

3*

4*/

5publicinterfaceSuperStore{

6

7

8CommoditygetCommodity(Stringid);

9}

相关推荐