使用Spring和Hibernate進行集成測試有多酷

我有罪,直到現在才寫集成測試(至少針對數據庫相關事務)。 因此,為了消除內感,我閱讀了如何在周末以最少的努力實現這一目標。 提供了一個小示例,描述了如何使用Spring和Hibernate輕松實現這一目標。 通過集成測試,您可以測試DAO(數據訪問對象)層,而無需部署應用程序。 對我來說,這是一個巨大的優勢,因為現在我甚至可以在不運行應用程序的情況下測試我的條件,命名查詢和排序。

休眠中有一個屬性,可讓您指定初始化會話工廠時要運行的sql腳本。 這樣,我現在可以用DAO層所需的數據填充表。 屬性如下:

<prop key='hibernate.hbm2ddl.import_files'>import.sql</prop>

根據hibernate 文檔 ,您可以有許多以逗號分隔的sql腳本。這里的一個陷阱是您無法使用該腳本創建表。 因為需要首先創建架構才能運行腳本。 即使您在腳本中發出了create table語句,執行腳本時也會忽略該語句,正如我所看到的那樣。

讓我首先向您展示我要測試的DAO課;

package com.unittest.session.example1.dao;import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;import com.unittest.session.example1.domain.Employee;@Transactional(propagation = Propagation.REQUIRED)
public interface EmployeeDAO {public Long createEmployee(Employee emp);public Employee getEmployeeById(Long id);
}
package com.unittest.session.example1.dao.hibernate;import org.springframework.orm.hibernate3.support.HibernateDaoSupport;import com.unittest.session.example1.dao.EmployeeDAO;
import com.unittest.session.example1.domain.Employee;public class EmployeeHibernateDAOImpl extends HibernateDaoSupport implementsEmployeeDAO {@Overridepublic Long createEmployee(Employee emp) {getHibernateTemplate().persist(emp);return emp.getEmpId();}public Employee getEmployeeById(Long id) {return getHibernateTemplate().get(Employee.class, id);}
}

沒什么大不了的,只是一個簡單的DAO,它有兩種方法,一種是持久化,另一種是檢索。 對我來說,測試檢索方法需要用一些數據填充Employee表。 這是前面介紹的導入sql腳本起作用的地方。 import.sql文件如下所示;

insert into Employee (empId,emp_name) values (1,'Emp test');

這只是一個基本腳本,我在其中將一條記錄插入到employee表中。 在此再次注意,employee表應該通過hibernate auto create DDL選項創建,以便運行sql腳本。 更多信息可以在這里找到。 同樣,我實例中的import.sql腳本也位于類路徑中。 這是為了在創建Session工廠時能夠將其拾取而執行的。

接下來,讓我們看看使用Spring運行集成測試有多么容易。

package com.unittest.session.example1.dao.hibernate;import static org.junit.Assert.*;import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.transaction.TransactionConfiguration;import com.unittest.session.example1.dao.EmployeeDAO;
import com.unittest.session.example1.domain.Employee;@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations='classpath:spring-context.xml')
@TransactionConfiguration(defaultRollback=true,transactionManager='transactionManager')
public class EmployeeHibernateDAOImplTest {@Autowiredprivate EmployeeDAO employeeDAO;@Testpublic void testGetEmployeeById() {Employee emp = employeeDAO.getEmployeeById(1L);assertNotNull(emp);}@Testpublic void testCreateEmployee(){Employee emp = new Employee();emp.setName('Emp123');Long key = employeeDAO.createEmployee(emp);assertEquals(2L, key.longValue());}}

這里要注意的幾件事是,您需要指示在Spring上下文中運行測試。 為此 ,我們使用SpringJUnit4ClassRunner 。 還將transction屬性設置為defaultRollback = true。 請注意,對于MySQL,要使其正常工作,您的表必須設置InnoDB引擎,因為MyISAM引擎不支持事務。

最后,我介紹了彈簧配置,它可以將所有東西連接起來;

<?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:aop='http://www.springframework.org/schema/aop'xmlns:tx='http://www.springframework.org/schema/tx' 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/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd  http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-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.unittest.session.example1' /><context:annotation-config /><tx:annotation-driven /><bean id='sessionFactory'class='org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean'><property name='packagesToScan'><list><value>com.unittest.session.example1.**.*</value></list></property><property name='hibernateProperties'><props><prop key='hibernate.dialect'>org.hibernate.dialect.MySQLDialect</prop><prop key='hibernate.connection.driver_class'>com.mysql.jdbc.Driver</prop><prop key='hibernate.connection.url'>jdbc:mysql://localhost:3306/hbmex1</prop><prop key='hibernate.connection.username'>root</prop><prop key='hibernate.connection.password'>password</prop><prop key='hibernate.show_sql'>true</prop><prop key='hibernate.dialect'>org.hibernate.dialect.MySQLDialect</prop><!-- --><prop key='hibernate.hbm2ddl.auto'>create</prop><prop key='hibernate.hbm2ddl.import_files'>import.sql</prop></props></property></bean><bean id='empDAO'class='com.unittest.session.example1.dao.hibernate.EmployeeHibernateDAOImpl'><property name='sessionFactory' ref='sessionFactory' /></bean><bean id='transactionManager'class='org.springframework.orm.hibernate3.HibernateTransactionManager'><property name='sessionFactory' ref='sessionFactory' /></bean></beans>

就是這樣。 我個人寧愿使用重量更輕的內存數據庫(例如hsqldb )來運行集成測試。

這是供任何想運行該程序并嘗試使用它的人的eclipse項目。

參考:來自My Journey Through IT博客的JCG合作伙伴 Dinuka Arseculeratne 與Spring + Hibernate進行集成測試有多酷 。

翻譯自: https://www.javacodegeeks.com/2012/11/how-cool-is-integration-testing-with-spring-and-hibernate.html

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

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

相關文章

假設mysql數據表t1有字段_使用ROMA Connect集成數據

概述ROMA Connect支持接入多種類型的數據源&#xff0c;并通過數據集成任務實現源端到目標端的數據集成轉換。ROMA Connect支持相同結構數據之間進行集成轉換&#xff0c;也支持異構數據之間進行集成轉換。本章節通過完成一個SQL Server到MySQL的數據集成配置樣例&#xff0c;幫…

vue-wechat-title

html中的title安裝&#xff1a;npm install vue-wechat-title --save1.在mian.js中//網頁titleimport VueTitle from vue-wechat-title Vue.use(VueTitle);2. 路由中加下 title { path: /, component: Index, meta: { title: 首頁 } }3. 在app.vue 中修改 router-view &a…

如何保證input的輸入值不會隨著提交 而變空_如何對web界面的應用進行測試?

一、輸入框&#xff1a;1、字符型輸入框&#xff1a;&#xff08;1&#xff09;字符型輸入框&#xff1a;英文全角、英文半角、數字、空或者空格、特殊字符“~&#xff01;#&#xffe5;%……&*&#xff1f;[]{}”特別要注意單引號和&符號。禁止直接輸入特殊字符時&…

CentOS6.x下,tomcat - web項目部署

1. 安裝tomcat tomcat安裝方法&#xff1a;http://www.cnblogs.com/vurtne-lu/p/6478440.html 2. 配置tomcat 修改server.xml文件 <!-- 使用 80 端口 (也可以使用其它端口)--> <Connector port"80" protocol"HTTP/1.1"connectionTimeout"200…

dedecms列表頁面隨機縮略圖調用

如果要利用dedecms制作扁平化主題&#xff0c;大概也能夠遇到相似的問題&#xff0c;那就是dedecms的縮略圖機制&#xff0c;在沒有縮略圖的情況下顯示單一的默認圖片&#xff0c;如果是wordpress可以很方便的定義函數調用隨機的縮略圖&#xff0c;即便是在沒有設置縮略圖并且文…

使用地圖觸發功能處理相干事件

本文介紹如何通過使用映射觸發器來處理一致性事件。 基本上&#xff0c;建議使用Oracle Coherence中的分布式數據管理來研究Oracle Coherence API的基本配置和實現。 映射觸發器是Oracle Coherence提供最高度定制的緩存管理系統的最重要功能之一。 MapTrigger代表一個功能代理…

阿里云服務器mysql莫名丟失_mysql數據庫丟失

mysql數據庫丟失云服務器(Elastic Compute Service&#xff0c;簡稱ECS)是阿里云提供的性能卓越、穩定可靠、彈性擴展的IaaS(Infrastructure as a Service)級別云計算服務。云服務器ECS免去了您采購IT硬件的前期準備&#xff0c;讓您像使用水、電、天然氣等公共資源一樣便捷、高…

01-HTML深入

1.1 瀏覽器的工作原理 把一些標簽解析成用戶可視化的頁面 1.2 HTML中的標簽與元素 在HTML中以<xx>開始&#xff0c;以</xx>結束&#xff0c;比如<html></html>等。 標簽和其內容統稱為元素&#xff0c;比如&#xff1a;<xx>h5</xx> 元素…

gitlab使用_使用 Docker 部署 Gitlab

GitLab 是一個用于倉庫管理系統的開源項目&#xff0c;使用Git作為代碼管理工具&#xff0c;并在此基礎上搭建起來的web服務&#xff0c;具有wiki和issue跟蹤功能。GitLab是當前應用非常廣泛的源代碼管理系統。1. 安裝docker引擎并啟動2. 獲取gitlab鏡像包查看下載好的鏡像3. 在…

js--webSocket入門

Websocket 1.websocket是什么&#xff1f; WebSocket是為解決客戶端與服務端實時通信而產生的技術。其本質是先通過HTTP/HTTPS協議進行握手后創建一個用于交換數據的TCP連接&#xff0c; 此后服務端與客戶端通過此TCP連接進行實時通信。 2.websocket的優點 以前我們實現推送技術…

node.js繼承

person.js module.exports function(){   this.name "person";   this.sleep function(){     console.log("sleep in the night");   }   this.eat function(){     console.log(eat food);   }} student.js var util require(&qu…

研究死鎖–第5部分:使用顯式鎖定

在我的上一個博客中&#xff0c;我研究了使用Java的傳統synchronized關鍵字和鎖排序來修復破碎的&#xff0c;死鎖的余額轉移示例代碼。 但是&#xff0c;有一種替代方法稱為顯式鎖定。 這里&#xff0c;將鎖定機制稱為顯式而非隱式的想法是&#xff0c; 顯式表示它不是Java語…

mysql 經典入門教程_MySQL 經典入門教程

MySQL 經典入門教程1 定義數據庫中的表&#xff1a;一行叫一條記錄。每一列叫一個屬性&#xff0c;或一個字段。主鍵&#xff1a;表中的某個特殊字段&#xff0c;具有唯一的確定的值&#xff0c;可以根據該字段唯一的確定一條記錄外鍵&#xff1a;表中的某個字段的值為另一張表…

druid連接池初始化慢_7、SpringBoot -連接池(Durid)

一導入相關核心包<dependencies>二 在application.ymlspring三、配置Druid Datasource(可選)Configuration五、監控訪問 http://localhost:8080/druid&#xff0c; 使用上面配置的賬號密碼。四、自動配置原理源代碼Configuration說明DataSourceProperties 配置相關 首先找…

負載均衡與反向代理

如果用域名 映射多了Ip &#xff1b; 外網應該用來實現 GSLB 1 輪詢pstream nginxDemo { server 127.0.0.1:8081; server 127.0.0.1:8082; } 最少鏈接web請求會被轉發到連接數最少的服務器上。 upstream nginxDemo { least_conn; server 127.0.…

使用工廠方法模式設計最佳實踐

在前面的“設計模式”示例中&#xff0c;我們解釋了當今常用的“工廠”模式。 在本節中&#xff0c;我們將了解具有更多抽象的更高級的解決方案。 該模式稱為工廠方法設計模式。 定義&#xff1a; Factory方法模式提供了一種用于創建對象的方法&#xff0c;但是將對象創建委托…

偏導數

引入 一元函數導數&#xff1a; 在一元函數中&#xff0c;我們已經知道導數就是函數的變化率&#xff08;對于一個一元函數&#xff0c;x增大了多少&#xff0c;y增大了多少&#xff0c;這個就是變化率&#xff09;。對于二元函數我們同樣要研究它的“變化率”。在xOy平面內&am…

qt繪制一圈圓_Qt繪制圓

最近開始折騰Qt了&#xff0c;手頭上的一個項目需要用到Qt來繪制一些簡單圖像。記錄下Qt繪制圓的過程&#xff1a;對于以A為圓心&#xff0c;半徑為R的圓&#xff0c;外部有一個外切的正方形&#xff0c;正方形上有B點。如下圖所示&#xff1a;對于void QPainter::drawArc(int …

前端基礎之HTML

HTML介紹 Web服務本質 import socketsk socket.socket()sk.bind(("127.0.0.1", 8080)) sk.listen(5)while True:conn, addr sk.accept()data conn.recv(8096)conn.send(b"HTTP/1.1 200 OK\r\n\r\n")conn.secd(b"<h1>Hello world!</h1&g…

指令引用了 內存 該內存不能為read 一直彈窗_【翻譯】使用Rust測試ARM和X86內存模型

原文標題: The Story of Tail Call Optimizations in Rust 原文標題: Examining ARM vs X86 Memory Models with Rust原文鏈接: https://www.nickwilcox.com/blog/arm_vs_x86_memory_model/公眾號&#xff1a; Rust碎碎念蘋果公司最近宣布&#xff0c;他們將要把筆記本和桌面電…