JUnit測試Spring Service和DAO(帶有內存數據庫)

這篇文章描述了如何為Spring Web Application的Services和DAO實現JUnit測試。 它建立在Spring MVC-Service-DAO-Persistence Architecture Example的基礎上 。 從Github的Spring-Web-JPA-Testing目錄中可以找到該示例。

提醒

  • 測試裝置 –固定狀態,用作運行測試的基準。
  • 單元測試 –這些測試驗證代碼(組件)片段是否按預期執行了某些功能。 在Java環境中,這些通常在類級別實現。
  • 集成測試 –集成測試是任何類型的測試檢查,以確保一組交互的組件一起正確執行預期的功能。

組態

我們需要一個JPA Hibernate配置來進行內存中測試:

@Configuration
@EnableTransactionManagement
public class JpaTestConfig {@Beanpublic LocalContainerEntityManagerFactoryBean entityManagerFactoryBean(){LocalContainerEntityManagerFactoryBean lcemfb= new LocalContainerEntityManagerFactoryBean();lcemfb.setDataSource(this.dataSource());lcemfb.setPackagesToScan(new String[] {'com.jverstry'});lcemfb.setPersistenceUnitName('MyTestPU');HibernateJpaVendorAdapter va = new HibernateJpaVendorAdapter();lcemfb.setJpaVendorAdapter(va);Properties ps = new Properties();ps.put('hibernate.dialect', 'org.hibernate.dialect.HSQLDialect');ps.put('hibernate.hbm2ddl.auto', 'create');lcemfb.setJpaProperties(ps);lcemfb.afterPropertiesSet();return lcemfb;}@Beanpublic DataSource dataSource(){DriverManagerDataSource ds = new DriverManagerDataSource();ds.setDriverClassName('org.hsqldb.jdbcDriver');ds.setUrl('jdbc:hsqldb:mem:testdb');ds.setUsername('sa');ds.setPassword('');return ds;}@Beanpublic PlatformTransactionManager transactionManager(){JpaTransactionManager tm = new JpaTransactionManager();tm.setEntityManagerFactory(this.entityManagerFactoryBean().getObject() );return tm;}@Beanpublic PersistenceExceptionTranslationPostProcessor exceptionTranslation(){return new PersistenceExceptionTranslationPostProcessor();}}

我們需要從軟件包掃描中排除生產配置(不進行“ com.jverstry”掃描):

@Configuration
@ComponentScan(basePackages = {'com.jverstry.Controller','com.jverstry.DAO','com.jverstry.Item','com.jverstry.Service'
})public class TestConfig {@Beanpublic MyService getMyService() {return new MyServiceImpl();}}


彈簧測試工具

  • @RunWith –這是一個JUnit批注,它允許使用與JUnit提供的運行程序不同的運行程序運行測試。
  • SpringJUnit4ClassRunner –這是用于Spring應用程序的JUnit測試運行器。 通常,測試類使用@RunWith(SpringJUnit4ClassRunner.class)進行注釋。
  • @ContextConfiguration –此批注可用于指定如何在Spring測試類中加載applicationContext。 可以通過XML文件或Java配置對象進行配置。

服務測試

以下類測試了注入的MyService實現的createAndRetrieve()方法:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes={ JpaTestConfig.class, TestConfig.class })
public class MyServiceImplTest {@Autowiredprivate MyService myService;@Testpublic void testCreateAndRetrieve() {MilliTimeItem retr = myService.createAndRetrieve();assertNotNull(retr);}}


DAO測試

下面的類測試我們的DAO實現。 從上面定義的測試配置類創建的EntityManager注入了我們的實現。

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes={ JpaTestConfig.class, TestConfig.class })
public class MyPersistenceDAOTest {@Autowiredprivate MyPersistenceDAO myDAO;@Testpublic void testCreateMilliTimeItem() {// This operation should not throw an Exceptionlong id = myDAO.createMilliTimeItem();}@Testpublic void testGetMilliTimeItem() {long id = myDAO.createMilliTimeItem();MilliTimeItem retr = myDAO.getMilliTimeItem(id);assertNotNull(retr);assertEquals(id,retr.getID());}}


警告

開始為Spring編寫JUnit測試時,可能會遇到以下錯誤消息:

Java.lang.ClassFormatError:
Absent Code attribute in method that is not native or abstract in class file javax/validation/Validation

上面的原因通常是由以下Maven依賴引起的:

<dependency><groupId>javax</groupId><artifactId>javaee-api</artifactId><version>6.0</version><type>jar</type></dependency>

它應該替換為:

<dependency><groupId>org.apache.geronimo.specs</groupId><artifactId>geronimo-jpa_2.0_spec</artifactId><version>1.1</version><scope>provided</scope></dependency>

另一個錯誤消息是:

javax.validation.ValidationException: Unable to find a default provider

通過添加以下Maven依賴關系可以解決此問題:

<dependency><groupId>org.hibernate</groupId><artifactId>hibernate-validator</artifactId><version>4.3.0.Final</version></dependency>

更多春天相關的帖子在這里 。

參考: 技術說明博客上的JCG合作伙伴 Jerome Versrynge的JUnit測試Spring Service和DAO(帶有內存數據庫) 。


翻譯自: https://www.javacodegeeks.com/2012/10/junit-testing-spring-service-and-dao.html

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

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

相關文章

c# 正則獲取html標簽內容,c# – 使用正則表達式在多個HTML標記之間獲取文本

使用正則表達式,我希望能夠在多個DIV標記之間獲取文本.例如,以下內容&#xff1a;first html taganother tag輸出&#xff1a;first html taganother tag我使用的正則表達式模式只匹配我的最后一個div標簽并錯過了第一個.碼&#xff1a;static void Main(string[] args){string…

Android之外部存儲(SD卡)

*手機的外部存儲空間&#xff0c;這個我們可以理解成電腦的外接移動硬盤&#xff0c;U盤也行。所有的Android設備都有兩個文件存儲區域&#xff1a;“內部”和“外部”存儲器。這兩個名稱來自早期的Android&#xff0c;當時大多數設備都提供內置的固定的內存&#xff08;內置存…

通用并發對象池

在本文中&#xff0c;我們將介紹如何在Java中創建對象池。 近年來&#xff0c;JVM的性能成倍增加&#xff0c;大多數類型的對象幾乎都變得多余&#xff0c;從而提高了對象池的性能。 從本質上講&#xff0c;對象的創建不再像以前那樣昂貴。 但是&#xff0c;有些對象在創建時肯…

圓周率的代碼表示,以及對其的理解。

轉載的簡書&#xff0c;for 記錄以及記憶。 http://www.jianshu.com/p/7208e4a58310 Thanks again&#xff01; 轉載于:https://www.cnblogs.com/xiapeng0701/p/7538281.html

華為NOVa8Pr0是用鴻蒙系統嗎,華為Nova8即將發布,采用麒麟芯片,高端平板適配鴻蒙系統...

大家好&#xff0c;我是老孫自從華為Mate40系列發布后&#xff0c;下一步新機動態備受外界關注&#xff0c;華為究竟會不會繼續生產手機呢&#xff1f;答案是肯定&#xff0c;華為Nova8系列將于本月發布&#xff0c;華為P50系列也在積極籌備&#xff0c;而且都少不了麒麟芯片&a…

使用路標的Scala和Java的Twitter REST API

如果您已閱讀此博客上的其他文章&#xff0c;您可能會知道我喜歡創建各種數據集的可視化。 我剛剛開始一個小項目&#xff0c;在這里我想可視化來自Twitter的一些數據。 為此&#xff0c;我想直接從Twitter檢索有關關注者的信息和個人資料信息。 我實際上開始尋找一組所有推特帳…

大話設計模式讀書筆記--11.抽象工廠模式

定義 抽象工廠模式定義: 提供一個創建一系列相關或相關依賴對象的接口,而無需指定他們具體的類 抽象工廠模式通常是用于創建一族產品&#xff0c;并且這族產品分不同的等級&#xff1b;不同的具體工廠類生產不同等級的一族產品 比如下圖(來源于網絡) 兩廂車和三廂車稱為兩個不同…

在線壓縮html,JS代碼壓縮 - javascript代碼壓縮 - jsmin在線js壓縮工具

輸入代碼&#xff1a;// is.js// (c) 2001 Douglas Crockford// 2001 June 3// The -is- object is used to identify the browser. Every browser edition// identifies itself, but there is no standard way of doing it, and some of// the identification is deceptive. T…

Primefaces dataTable設置某個cell的樣式問題

設置primefaces dataTable的源網段列的Cell可以編輯&#xff0c;當回車鍵保存時&#xff0c;判斷是否輸入的網段合法&#xff0c;如果不合法就顯示警告信息&#xff0c;并將這個不合法的數據用紅色表示。問題是&#xff0c;怎么給這一個cell設定樣式。通過給標簽設定ID然后在后…

鴨子在Java中打字? 好吧,不完全是

根據維基百科&#xff0c;鴨子的打字是&#xff1a; 動態類型的類型&#xff0c;其中對象的方法和屬性確定有效的語義&#xff0c;而不是其從特定類或特定接口的實現繼承 用簡單的話 當我看到一只鳥走路像鴨子&#xff0c;游泳像鴨子&#xff0c;嘎嘎像鴨子一樣時&#xff0c…

前端學習路線

第一部分 HTML 第一章 職業規劃和前景 職業方向規劃定位&#xff1a; web前端開發工程師 web網站架構師 自己創業 轉崗管理或其他 web前端開發的前景展望&#xff1a; 未來IT行業企業需求最多的人才 結合最新的html5搶占移動端的市場 自己創業做老板 隨著互聯網的普及we…

p1164【立方體求和】

題目&#xff1a; SubRaY有一天得到一塊西瓜,是長方體形的....SubRaY發現這塊西瓜長m厘米,寬n厘米,高h厘米.他發現如果把這塊西瓜平均地分成m*n*h塊1立方厘米的小正方體,那么每一小塊都會有一個營養值(可能為負,因為西瓜是有可能壞掉的,但是絕對值不超過200).現在SubRaY決定從這…

html生成自定義表格,自定義js的表格插件

場景&#xff1a;指定元素&#xff0c;生成自定義表格。目的&#xff1a;了解js的插件開發。html代碼&#xff1a;自定義表格插件var test new MyTable({elid:"mytable",//定義哪個div要生成表單thead:{//指定列名name:"姓名",age:"年齡",addr:…

使用JBehave,Gradle和Jenkins的行為驅動開發(BDD)

行為驅動開發 &#xff08;BDD&#xff09;是一個協作過程 &#xff0c;產品負責人&#xff0c;開發人員和測試人員可以合作交付可為企業帶來價值的軟件。 BDD是 測試驅動開發 &#xff08;TDD&#xff09; 的合理下一步 。 行為驅動的發展 本質上&#xff0c;BDD是一種交付…

手型顯示html,css各種手型集合(css禁止手型)

html>css各種手型集合(css禁止手型).auto { cursor: auto; }.deafult { cursor: default; }.none { cursor: none; }.context-menu { cursor: context-menu; }.help { cursor: help; }.pointer { cursor: pointer; }.p…

Maven Fluido Skin和Javadoc類圖

我使用Maven網站已有一段時間了&#xff0c;對此我感到非常滿意。 我不想在Maven 3之后更新我的項目&#xff0c;但是沒關系&#xff0c;Maven 3帶來了許多新奇的東西。 但是&#xff0c;有兩件事使我感到煩惱&#xff1a;缺乏美觀和現代的外觀&#xff0c;以及瀏覽復雜代碼的J…

ZooKeeper安裝,部署

實驗環境 192.168.1.10  Zookeeper1:2181, Zookeeper2:2182 192.168.1.11  ZooKeeper3:2181 依賴環境 JDK1.7 安裝&#xff0c;配置 1、下載解壓 # 192.168.1.10cd /data/server tar -zxv -f zookeeper-3.4.6.tar.gz ln -s zookeeper-3.4.6 zookeeper1ln -s zookeeper-3.4.…

咸寧省2021年模擬高考成績查詢怎么查,2021咸寧市地區高考成績排名查詢,咸寧市高考各高中成績喜報榜單...

距離2018年高考還有不到一個月的時間了&#xff0c;很多人在準備最后沖刺的同時&#xff0c;也在關心高考成績。2018各地區高考成績排名查詢,高考各高中成績喜報榜單尚未公布&#xff0c;下面是往年各地區高考成績排名查詢,高考各高中成績喜報榜單&#xff0c;想要了解同學可以…

保證主題,JMS規范和ActiveMQ的消息傳遞

最近&#xff0c;一個客戶要求我仔細研究ActiveMQ的“持久”消息的實現&#xff0c;它如何應用于主題以及在存在非持久訂閱者的故障轉移方案中會發生什么。 我已經了解到&#xff0c;JMS語義規定&#xff0c;即使面對消息代理提供者失敗&#xff0c;也只能保證主題的持久訂戶以…

java中的除法及求余運算特殊性。

1.如果除法運算符的兩個操作數都是整數類型&#xff0c;則計算結果也是整數&#xff0c;就是將自然除法的結果截斷取整&#xff0c;例如19/4的結果是4&#xff0c;而不是5。并且除數不能0&#xff0c;否則將引起除0異常 2.如果運算符的兩個操作數有1個是浮點數&#xff0c;或兩…