通过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??*?@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?{
6?
7?????
8?????Commodity?getCommodity(String?id);
9?}