通过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} |