- 我們使用Maven構建和單元測試一些基于Spring的靜態Web服務。
- 然后,我們使用Maven Jetty插件啟動Web服務器并將其部署到其中。
- 我們創建一個內存數據庫并創建架構
- 最后,我們在單獨的\ src \ integrationtest \ java目錄中運行所有集成測試
代碼結構

運行示例
完整代碼托管在Google代碼上。 使用以下命令將其檢出并運行。 在運行測試之前,請確保端口8080上沒有任何運行。
svn co https://designbycontract.googlecode.com/svn/trunk/examples/maven/spring-rest-example
cd spring-rest-example
mvn clean install -Pit,jetty
您可以在以下Cloudbees托管的Jenkins實例上查看完整版本。 https://designbycontract.ci.cloudbees.com/job/spring-rest-example/
運行示例的結果

- 標準的Maven測試結構中的測試照常在單元測試階段運行。
- Jetty Web服務器啟動
- 包含Web服務器的戰爭已部署到服務器
- 已啟動hsqldb內存數據庫并創建了架構。
- \ src \ integrationtest \ java目錄中的測試在集成測試階段運行。
- 服務器已關閉。
如何創建Spring Service類
貿易服務非常簡單。 它使用存儲庫來創建和查找交易。 我沒有包含使整個事情盡可能簡單的例外。 這里唯一的技巧是添加@Service批注,否則它是直接的Java。
@Service
public class SimpleTradeService implements TradeService {@AutowiredTradeRepository tradeRepository; public SimpleTradeService(TradeRepository tradeRepository) {this.tradeRepository = tradeRepository;}@Overridepublic Long createTrade(Trade t) {Long id = tradeRepository.createTrade(t);return id;}@Overridepublic Trade getTradeById(Long id) {return tradeRepository.getTradeById(id);}
如何創建數據庫存儲庫類
上面的服務使用交易存儲庫來創建和查找交易。 我們使用Spring類HibernateDaoSupoort來創建此類,并使事情保持簡單。 通過擴展此類,我們只需要創建我們的交易對象類,并在spring config中定義我們的數據庫詳細信息即可。 該框架負責所有其他細節。
public class HibernateTradeRepository extends HibernateDaoSupport implements TradeRepository{@Overridepublic Trade getTradeByReference(String reference) {throw new RuntimeException();}@Overridepublic Long createTrade(Trade trade) {return (Long) getHibernateTemplate().save(trade);}@Overridepublic Trade getTradeById(Long id) {return getHibernateTemplate().get(Trade.class, id);}
}
如何創建數據庫交易類
我們使用標準的JPA批注定義我們的數據庫交易對象
@Entity
public class Trade {@Idprivate long id;
@Entity批注將對象標記為數據庫實體。 @Id注釋顯示了我們希望成為表主鍵的字段。 對于其余字段,我們使用默認行為,因此不需要其他注釋。
如何配置數據庫
對于此示例,我們將使用Hsqldb創建我們的數據庫。 http://hsqldb.org/每次我們啟動服務器時都會創建一個新的實例。 要設置數據庫,我們要做的就是在spring config trade-servlet.xml中定義它
<bean id="sessionFactory"
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"><property name="packagesToScan"value="com.dbc.model" /><property name="hibernateProperties"><props><prop key="hibernate.show_sql">true</prop><prop key="hibernate.format_sql">true</prop><prop key="hibernate.transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</prop><prop key="hibernate.dialect">org.hibernate.dialect.HSQLDialect</prop><prop key="hibernate.connection.pool_size">0</prop><prop key="hibernate.connection.driver_class">org.hsqldb.jdbcDriver</prop><prop key="hibernate.connection.url">jdbc:hsqldb:target/data/tradedatabase;shutdown=true</prop><prop key="hibernate.connection.username">sa</prop><prop key="hibernate.connection.password"></prop><prop key="hibernate.connection.autocommit">true</prop><prop key="hibernate.jdbc.batch_size">0</prop><prop key="hibernate.hbm2ddl.auto">update</prop></props></property></bean>
會話工廠定義我們的數據庫連接詳細信息。 最重要的屬性是
<prop key="hibernate.hbm2ddl.auto">update</prop>
該屬性告訴hibernate在應用程序啟動時更新數據庫。 它將根據我們交易對象上的注釋有效地為交易對象創建表。 運行測試時,您將看到在啟動時執行以下SQL。
11:30:31,899 DEBUG org.hibernate.tool.hbm2ddl.SchemaUpdate SchemaUpdate:203
- create table
Trade (id bigint not null, description varchar(255), reference varchar(255), primary key (id))
多數民眾贊成在一個新的數據庫設置,并準備就緒。
創建寧靜的界面。
我將在這里介紹基礎知識。 對于一些很棒的例子,請遵循以下鏈接http://blog.springsource.com/2009/03/08/rest-in-spring-3-mvc/ http://www.stupidjavatricks.com/?p=54
如何創建Spring控制器
Spring控制器是整個示例的關鍵。 是控制器接受我們的請求并將其傳遞給貿易服務部門進行處理。 它定義了restful接口。 我們使用@PathVariable使事情變得簡單。
@RequestMapping(value = "/create/trade/{id}")
public ModelAndView createTrade(@PathVariable Long id) {Trade trade = new Trade(id); service.createTrade(trade);ModelAndView mav = new ModelAndView("tradeView", BindingResult.MODEL_KEY_PREFIX + "trade", trade);return mav;
}@RequestMapping(value = "/find/trade/{id}")
public ModelAndView findTradeById(@PathVariable Long id) {Trade trade = service.getTradeById(id);ModelAndView mav = new ModelAndView("tradeView", BindingResult.MODEL_KEY_PREFIX + "trade", trade);return mav;
}
通過使用來自/ find / trade / {id}的值填充@PathVariable id可以非常簡單地工作,例如,請求/ find / trade / 1會將引用填充為“ 1”,而請求/ find / trade / 29則將填充引用為“ 29”可在此處找到更多信息: http : //static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/mvc.html#mvc-ann-requestmapping-uri-templates
如何配置Web應用程序
web.xml中Web應用程序的配置非常簡單。 首先我們注冊Spring Servlet
tradeorg.springframework.web.servlet.DispatcherServlet1
接下來,我們定義到servlet的映射。 該映射會將所有請求傳遞給我們的servlet。
trade/*
如何配置Spring
Spring配置由許多不同的元素組成。 第一行只是告訴Spring在哪里尋找注釋
BeanNameViewResolver使用名稱
看起來很恐怖的XML可以確保將Trade對象作為XML返回。 XStream將獲取對象,并自動將其轉換為XML格式。
Trade類為此定義了XStream注釋。
@XStreamAlias("trade")
public class Trade {
在我們的例子中,您可以從測試中看到,我們從/ search / trade / 1獲得了以下內容
1
如何啟動和停止Jetty服務器
我使用Jetty插件啟動服務器并部署包含服務的war文件。 http://docs.codehaus.org/display/JETTY/Maven+Jetty+Plugin服務器使用pom.xml中的以下代碼段啟動服務器
<execution><id>start-jetty</id><phase>pre-integration-test</phase><goals><goal>run</goal></goals>
</execution>
使用pom.xml中的以下代碼片段停止服務器
<execution><id>stop-jetty</id><phase>post-integration-test</phase><goals><goal>stop</goal></goals>
</execution>
如何運行集成測試
集成測試使用原始文章中所述的故障保護運行。 http://johndobie.blogspot.com/2011/06/seperating-maven-unit-integration-tests.html我們使用新的Spring RestTemplate來簡化對服務的調用。
@Test
public void testGetTradeFromRestService() throws Exception {long id = 10L;createTrade(id);String tradeXml = new RestTemplate().getForObject("http://localhost:8080/find/trade/{id}",String.class, id);System.out.println(tradeXml);Trade trade = getTradeFromXml(tradeXml);assertEquals(trade.getId(), id);
}
參考: Agile Engineering Techniques博客上來自JCG合作伙伴 John Dobie的Maven集成測試和Spring Restful Services 。
翻譯自: https://www.javacodegeeks.com/2012/05/maven-integration-testing-and-spring.html