本文从一个例子出发,根据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  * @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 }

 

    当然这个单元测试不能通过(无法编译)。接下来就是编写代码,让单元测试能顺利通过添加 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 <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

/**
* @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  * @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

/**
* @author xmatthew
*
*/
public interface SuperStore {


Commodity getCommodity(String id);
}

 

 

1 /**

2  * @author xmatthew

3  *

4  */

5 public interface SuperStore {


7     

8     Commodity getCommodity(String id);

9 }