Maven集成測試和Spring Restful Services

介紹
我的原始博客通過一個非常簡單的示例展示了如何分離Maven單元和集成測試。 http://johndobie.blogspot.com/2011/06/seperating-maven-unit-integration-tests.html此后,許多人要求我提供比最初使用的示例更實際的示例。 這篇文章展示了如何在實際環境中(實際將應用程序部署到服務器上)使用原始方法拆分單元測試和集成測試。
  • 我們使用Maven構建和單元測試一些基于Spring的靜態Web服務。
  • 然后,我們使用Maven Jetty插件啟動Web服務器并將其部署到其中。
  • 我們創建一個內存數據庫并創建架構
  • 最后,我們在單獨的\ src \ integrationtest \ java目錄中運行所有集成測試
本文旨在直接展示在運行集成測試之前,如何以實際方式使用Maven來啟動一組服務并將其部署到正在運行的服務器上。 它與REST或Spring MVC的微妙細節無關。 我將對此進行簡單介紹,以構建一個可運行的應用程序,同時為那些需要更多細節的人提供更深入的文章參考。

代碼結構

運行示例

完整代碼托管在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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/373033.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/373033.shtml
英文地址,請注明出處:http://en.pswp.cn/news/373033.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

玩cf出現outofmemory_CF畫質粗糙平衡感人,卻能歷經十年經久不衰,靠的是什么?...

Hello大家好&#xff0c;我是沐辰。《穿越火線》這款游戲國內運營時間已長達十年&#xff0c;從最早接觸這款游戲開始&#xff0c;很多玩家都在這里烙刻下了許多關于青春的回憶。CF的許多問題一直頗受詬病&#xff0c;例如落后且粗糙的畫質、英雄級武器與平民武器的巨大差距、千…

jquery遍歷ajax返回的json數據

我們以前在前端遍歷ajax拿到的數據一般都是用for或其他方式遍歷&#xff0c;這樣做麻煩且費事&#xff0c;效率不高&#xff0c;下面提供一個函數&#xff0c;只需調用函數即可把數據遍歷出來&#xff0c;方便高效。 html代碼&#xff1a; <html> <head><script…

Apache JMeter:隨心所欲進行負載測試

這是有關使用Apache JMeter進行負載測試的第二篇文章&#xff0c;請在此處閱讀第一篇文章&#xff1a; 有關對關系數據庫進行負載測試的分步教程。 JMeter有很多采樣器 。 如果您需要JMeter不提供的采樣器&#xff0c;則可以編寫自定義采樣器。 &#xff08;自定義采樣器在JMet…

html5歷史管理

在網易云課堂上看了妙味課堂的關于html5歷史管理的課程&#xff0c;在這里做一下筆記。 單頁面或ajax局部刷新的頁面中&#xff0c;沒有辦法通過前一步和后一步得到歷史訪問數據&#xff0c;此時有兩種方法可以解決這個問題&#xff1a; 1.onhashchange事件&#xff0c;示例代碼…

elementui下拉框 清空_巧妙解決element-ui下拉框選項過多的問題

1. 場景描述不知道你有沒有這樣的經歷&#xff0c;下拉框的選項很多&#xff0c;上萬個選項甚至更多&#xff0c;這個時候如果全部把數據放到下拉框中渲染出來&#xff0c;瀏覽器會卡死&#xff0c;體驗會特別不好用人會說element-ui的select有一個remote-method&#xff0c;支…

致敬詞

見義勇為致敬詞 面對災難和死神&#xff0c;你們大義凜然、知險而上&#xff0c;把平安和生機留給他人&#xff0c;把困難和危險留給自己。巍巍乎高山景行&#xff0c;錚錚然鐵骨俠風&#xff1b;壯志譜傳奇&#xff0c;熱血寫春秋。你們是&#xff1a;百姓英雄&#xff0c;平安…

MOXy作為您的JAX-RS JSON提供程序–客戶端

最近&#xff0c;我發布了如何利用EclipseLink JAXB&#xff08;MOXy&#xff09;的JSON綁定來創建RESTful服務。 在本文中&#xff0c;我將演示在客戶端利用MOXy的JSON綁定有多么容易。 MOXy作為您的JAX-RS JSON提供程序–服務器端 MOXy作為您的JAX-RS JSON提供程序–客戶端 …

經常使用計算機的孩子,常玩電腦對孩子負面影響大,家長們不容小覷!

相信不少的家庭都會備有電腦&#xff0c;人們在網絡世界里面能夠找到自己需要的東西。不僅是大人喜歡玩電腦&#xff0c;小孩也喜歡玩電腦。然而常玩電腦對孩子負面影響大嗎&#xff1f;有多大&#xff1f;一、行為問題全國青少年教育協會指出&#xff0c;5歲以下的使用電腦的孩…

基于SpringBoot的養老院管理系統

文章目錄 項目介紹主要功能截圖:部分代碼展示設計總結項目獲取方式?? 作者主頁:超級無敵暴龍戰士塔塔開 ?? 簡介:Java領域優質創作者??、 簡歷模板、學習資料、面試題庫【關注我,都給你】 ??文末獲取源碼聯系?? 項目介紹 基于SpringBoot的養老院管理系統,java項…

外呼機器人起名_智能外呼機器人,目前都有哪些公司做產品?

做智能外呼機器人的企業現在已經挺多了&#xff0c;比如各個答案中提到的各家的產品。它的市場認可度也比較高&#xff0c;大家都知道它能用于通知、回訪、問卷調查、營銷等業務場景。外呼機器人的價值很好衡量&#xff0c;用了外呼機器人后&#xff0c;能給企業賺多少錢&#…

VMware下ubuntu與Windows實現文件共享的方法

最近安裝caffe需要將Windows下文件拷貝到ubuntu16.04下&#xff0c;就進行了共享文件夾的設置&#xff0c;期間遇到一些困難&#xff0c;記錄下來&#xff0c;方便以后遇到此類問題不再困惑。 &#xff08;記錄只為更好的分享&#xff09; 言歸正傳&#xff1a; 1、首先需要在u…

前端開發流程

一般都是在我們開發一個項目之前我們會進行一個討論會&#xff0c;然后一起分析一下這個項目應該怎么去做&#xff0c;那些地方可以用最新的一些技術&#xff0c;那些技術有兼容問題&#xff0c;哪些可以實現&#xff0c;哪些不可以實現&#xff0c;這些討論完以后&#xff0c;…

TestNG和Maven配置指南

為了有用&#xff0c;自動測試應該運行得非常快。 否則&#xff0c;將不會在開發期間經常運行&#xff0c;甚至在開發人員工作站的默認配置中將被忽略。 最簡單的規則是僅編寫小型單元測試&#xff0c;該測試將模擬給定類的鄰居。 但是&#xff0c;有時在IoC容器上下文&#xf…

微型計算機廣告牌實驗報告,微型計算機實驗報告1資料.doc

實驗報告1. 實驗名稱程序編譯及調試2. 實驗目的掌握匯編語言語句格式&#xff0c;程序結構&#xff0c;上機調試步驟和各種類型程序的設計方法。了解匯編語言的基本語法&#xff0c;匯編程序的功能和匯編&#xff0c;調試過程&#xff0c;偽指令&#xff0c;匯編語言程序設計&a…

mybatis入門-新手注意問題

參數問題 在映射文件中通過parameterType指定輸入參數的類型&#xff1b;在映射文件中通過resultType指定輸出結果的類型。 占位符和拼接符問題 #{}表示一個占位符號&#xff0c;#{}接收輸入參數&#xff0c;類型可以是簡單類型&#xff0c;pojo、hashmap。 如果接收簡單類型&a…

python文件管理包_Python標準庫04 文件管理 (部分os包,shutil包)

Python標準庫04 文件管理 (部分os包&#xff0c;shutil包)在操作系統下&#xff0c;用戶可以通過操作系統的命令來管理文件&#xff0c;參考。Python 標準庫則允許我們從 Python 內部管理文件。相同的目的&#xff0c;我們有了兩條途徑。盡管在 Python 調用標準庫的方式不如操作…

Delphi Berlin 10.1 for iOS 成生 info.plist 順序改變了

在 Delphi Seattle 10 update 1 版本&#xff08;含之前版本&#xff09;&#xff0c;只要 Project > Build 會立即生成 info.plist 如果需要修改 info.plist 可以利用 TMS 提供的修改工具 Fixing on iOS 9 來修改。 在 Delphi Berlin 10.1 版本&#xff0c;順序改變了&…

MANIFEST.MF和feature.xml版本控制規則

我永遠忘記了OSIF插件和功能的 MANIFEST.MF和feature.xml中的依賴項聲明的規則是什么。 谷歌搜索經常導致沮喪而不是答案。 所以&#xff0c;因為今天我實際上找到了這些規則的簡要列表&#xff0c;所以我想在這里重新發布它們&#xff0c;并進行一些小的修改以幫助闡明。 OSGi…

遠程桌面連接時無法訪問遠程計算機的計算機屬性提示系統調用失敗,遠程過程調用失敗【應對技巧】...

喜歡使用電腦的小伙伴們一般都會遇到win7系統遠程過程調用失敗的問題&#xff0c;突然遇到win7系統遠程過程調用失敗的問題就不知道該怎么辦了&#xff0c;其實win7系統遠程過程調用失敗的解決方法非常簡單&#xff0c;按照1&#xff1a;第一步我們可以看到sql server數據庫出現…

MVC View顯示詳解(RenderBody,RenderPage,RenderSection,Partial)

一、Views文件夾 -> Shared文件夾下的 _Layout.cshtml 母版頁 RenderBody 當創建基于_Layout.cshtml布局頁面的視圖時&#xff0c;視圖的內容會和布局頁面合并&#xff0c;而新創建視圖的內容會通過_Layout.cshtml布局頁面的RenderBody()方法呈現在標簽之間。 RenderPage從…