javascript
maven集成spring_Maven集成测试和Spring Restful Services
maven集成spring
介紹 我的原始博客通過一個(gè)非常簡單的示例展示了如何分離Maven單元和集成測試。 http://johndobie.blogspot.com/2011/06/seperating-maven-unit-integration-tests.html此后,許多人要求我提供比最初使用的示例更實(shí)際的示例。 這篇文章顯示了如何在實(shí)際環(huán)境中(實(shí)際將應(yīng)用程序部署到服務(wù)器上)使用原始方法拆分單元測試和集成測試。- 我們使用Maven構(gòu)建和對(duì)基于Spring的靜態(tài)Web服務(wù)進(jìn)行單元測試。
- 然后,我們使用Maven Jetty插件啟動(dòng)Web服務(wù)器并將其部署到其中。
- 我們創(chuàng)建一個(gè)內(nèi)存數(shù)據(jù)庫并創(chuàng)建架構(gòu)
- 最后,我們?cè)趩为?dú)的\ src \ integrationtest \ java目錄中運(yùn)行所有集成測試
代碼結(jié)構(gòu)
運(yùn)行示例
完整代碼托管在Google代碼上。 使用以下命令將其檢出并運(yùn)行。 在運(yùn)行測試之前,請(qǐng)確保端口8080上沒有任何運(yùn)行。
svn co https://designbycontract.googlecode.com/svn/trunk/examples/maven/spring-rest-example cd spring-rest-example mvn clean install -Pit,jetty您可以在以下Cloudbees托管的Jenkins實(shí)例上查看完整版本。 https://designbycontract.ci.cloudbees.com/job/spring-rest-example/
運(yùn)行示例的結(jié)果
- 標(biāo)準(zhǔn)的Maven測試結(jié)構(gòu)中的測試照常在單元測試階段運(yùn)行。
- Jetty Web服務(wù)器啟動(dòng)
- 包含Web服務(wù)器的戰(zhàn)爭已部署到服務(wù)器
- 已啟動(dòng)hsqldb內(nèi)存數(shù)據(jù)庫并創(chuàng)建了架構(gòu)。
- \ src \ integrationtest \ java目錄中的測試在集成測試階段運(yùn)行。
- 服務(wù)器已關(guān)閉。
如何創(chuàng)建Spring Service類
貿(mào)易服務(wù)非常簡單。 它使用存儲(chǔ)庫來創(chuàng)建和查找交易。 我沒有包含使整個(gè)過程盡可能簡單的例外。 這里唯一的技巧是添加@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);}如何創(chuàng)建數(shù)據(jù)庫存儲(chǔ)庫類
上面的服務(wù)使用交易存儲(chǔ)庫來創(chuàng)建和查找交易。 我們使用Spring類HibernateDaoSupoort來創(chuàng)建此類,并使事情保持簡單。 通過擴(kuò)展此類,我們只需要?jiǎng)?chuàng)建我們的交易對(duì)象類,并在spring config中定義我們的數(shù)據(jù)庫詳細(xì)信息。 該框架負(fù)責(zé)所有其他細(xì)節(jié)。
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);} }如何創(chuàng)建數(shù)據(jù)庫交易類
我們使用標(biāo)準(zhǔn)的JPA批注定義我們的數(shù)據(jù)庫交易對(duì)象
@Entity public class Trade {@Idprivate long id;@Entity批注將對(duì)象標(biāo)記為數(shù)據(jù)庫實(shí)體。 @Id注釋顯示了我們想成為表主鍵的字段。 對(duì)于其余字段,我們使用默認(rèn)行為,因此不需要其他注釋。
如何配置數(shù)據(jù)庫
對(duì)于此示例,我們將使用Hsqldb創(chuàng)建數(shù)據(jù)庫。 http://hsqldb.org/每次我們啟動(dòng)服務(wù)器時(shí)都會(huì)創(chuàng)建一個(gè)新的實(shí)例。 要設(shè)置數(shù)據(jù)庫,我們要做的就是在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>會(huì)話工廠定義我們的數(shù)據(jù)庫連接詳細(xì)信息。 最重要的屬性是
<prop key="hibernate.hbm2ddl.auto">update</prop>該屬性告訴hibernate在應(yīng)用程序啟動(dòng)時(shí)更新數(shù)據(jù)庫。 它將根據(jù)我們交易對(duì)象上的注釋有效地為交易對(duì)象創(chuàng)建表。 運(yùn)行測試時(shí),您將看到在啟動(dòng)時(shí)執(zhí)行以下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))多數(shù)民眾贊成在新的數(shù)據(jù)庫設(shè)置,并準(zhǔn)備就緒。
創(chuàng)建寧靜的界面。
我將在這里介紹基礎(chǔ)知識(shí)。 對(duì)于一些很棒的例子,請(qǐng)遵循以下鏈接http://blog.springsource.com/2009/03/08/rest-in-spring-3-mvc/ http://www.stupidjavatricks.com/?p=54
如何創(chuàng)建Spring控制器
Spring控制器是整個(gè)示例的關(guān)鍵。 是控制器接受我們的請(qǐng)求并將其傳遞給貿(mào)易服務(wù)部門進(jìn)行處理。 它定義了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可以非常簡單地工作,例如,請(qǐng)求/ find / trade / 1會(huì)將引用填充為“ 1”,而請(qǐng)求/ 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應(yīng)用程序
web.xml中Web應(yīng)用程序的配置非常簡單。 首先我們注冊(cè)Spring Servlet
tradeorg.springframework.web.servlet.DispatcherServlet1接下來,我們定義到servlet的映射。 該映射會(huì)將所有請(qǐng)求傳遞給我們的servlet。
trade/*如何配置Spring
Spring配置由許多不同的元素組成。 第一行只是告訴Spring在哪里尋找注釋
BeanNameViewResolver使用名稱
這個(gè)看起來很恐怖的XML可以確保將Trade對(duì)象作為XML返回。 XStream將獲取對(duì)象,并自動(dòng)將其轉(zhuǎn)換為XML格式。
Trade類為此定義了XStream注釋。
@XStreamAlias("trade") public class Trade {在我們的案例中,您可以從測試中看到我們從/ search / trade / 1獲得了以下內(nèi)容
1如何啟動(dòng)和停止Jetty服務(wù)器
我使用Jetty插件啟動(dòng)服務(wù)器并部署包含服務(wù)的war文件。 http://docs.codehaus.org/display/JETTY/Maven+Jetty+Plugin服務(wù)器使用pom.xml中的以下代碼段啟動(dòng)服務(wù)器
<execution><id>start-jetty</id><phase>pre-integration-test</phase><goals><goal>run</goal></goals> </execution>使用pom.xml中的以下代碼片段停止服務(wù)器
<execution><id>stop-jetty</id><phase>post-integration-test</phase><goals><goal>stop</goal></goals> </execution>如何運(yùn)行集成測試
如原始文章中所述,使用故障保護(hù)運(yùn)行集成測試。 http://johndobie.blogspot.com/2011/06/seperating-maven-unit-integration-tests.html我們使用新的Spring RestTemplate來簡化對(duì)服務(wù)的調(diào)用。
@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
maven集成spring
總結(jié)
以上是生活随笔為你收集整理的maven集成spring_Maven集成测试和Spring Restful Services的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电脑Win7系统桌面图标太大怎么调小如何
- 下一篇: moxy json介绍_MOXy作为您的