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