1. 程式人生 > >spring test+junit+dbunit註解及使用說明

spring test+junit+dbunit註解及使用說明


Spring TestContext 測試框架體系結構

TestContext 核心類、支援類以及註解類

TestContext 測試框架的核心由 org.springframework.test.context 包中三個類組成,分別是 TestContext TestContextManager 類以及 TestExecutionListener 介面。

每次測試都會建立TestContextManagerTestContextManager管理了一個TestContext 它負責持有當前測試的上下文。TestContextManager還負責在測試執行過程中更新TestContext

的狀態並代理到TestExecutionListener 它用來監測測試實際的執行(如提供依賴注入、管理事務等等)

TestContext

TestContext:封裝測試執行的上下文,與當前使用的測試框架無關。

TestContextManager

TestContextManagerSpring TestContext Framework的主入口點, 負責管理單獨的TestContext並在定義好的執行點上向所有註冊的TestExecutionListener發出事件通知: 測試例項的準備,先於特定的測試框架的前置方法,遲於後置方法

TestExecutionListener

TestExecutionListener:定義了一個監聽器API與TestContextManager釋出的測試執行事件進行互動, 而該監聽器就是註冊到這個TestContextManager上的。

Spring提供了TestExecutionListener的三個實現, 他們都是使用預設值進行配置的(通過@TestExecutionListeners註解): DependencyInjectionTestExecutionListenerDirtiesContextTestExecutionListenerTransactionalTestExecutionListener, 他們對測試例項提供了依賴注入支援,處理@DirtiesContext

註解,並分別使用預設的回滾語義對測試提供事務支援。

DependencyInjectionTestExecutionListener:該監聽器提供了自動注入的功能,它負責解析測試用例中 @Autowried 註解並完成自動注入;

DirtiesContextTestExecutionListener:一般情況下測試方法並不會對 Spring 容器上下文造成破壞(改變 Bean 的配置資訊等),如果某個測試方法確實會破壞 Spring 容器上下文,你可以顯式地為該測試方法新增 @DirtiesContext 註解,以便 Spring TestContext 在測試該方法後重新整理 Spring 容器的上下文,而 DirtiesContextTestExecutionListener 監聽器的工作就是解析 @DirtiesContext 註解;

TransactionalTestExecutionListener:它負責解析 @Transaction@NotTransactional 以及 @Rollback 等事務註解的註解。@Transaction 註解讓測試方法工作於事務環境中,不過在測試方法返回前事務會被回滾。你可以使用 @Rollback(false) 讓測試方法返回前提交事務。而 @NotTransactional 註解則讓測試方法不工作於事務環境中。此外,你還可以使用類或方法級別的 @TransactionConfiguration 註解改變事務管理策略

@TestExecutionListeners

用來註冊TestExecutionListener

@TestExecutionListeners({DependencyInjectionTestExecutionListener.class, DirtiesContextTestExecutionListener.class})

@ContextConfiguration

用來指定載入的Spring配置檔案的位置,會載入預設配置檔案

1.locations屬性

@ContextConfiguration不帶locations屬性,GenericXmlContextLoader會基於測試類的名字產生一個預設的位置.

如果類名叫做com.example.MyTest,那麼GenericXmlContextLoader就會從"classpath:/com/example/MyTest-context.xml"載入應用上下文。

@ContextConfiguration 若帶有locations屬性

@ContextConfiguration(locations= { "spring-service.xml","spring-service1.xml" })會去載入指定檔案

2.inheritLocations屬性

@ContextConfigurationinheritLocations屬性 (是否繼承父類的locations),預設為true

@ContextConfiguration(locations={"/base-context.xml"})

@ContextConfiguration(locations={"/extended-context.xml"})

true,會將/base-context.xml, /extended-context.xml 合併載入,若有過載的bean為子類為準

false,遮蔽掉父類的資源位置

@RunWith

@RunWith 註解指定測試用例的執行器

@RunWith(SpringJUnit4ClassRunner.class)

SpringJUnit4ClassRunner

Spring TestContext 框架提供了擴充套件於 org.junit.internal.runners.JUnit4ClassRunner SpringJUnit4ClassRunner 執行器,它負責總裝 Spring TestContext 測試框架並將其統一到 JUnit 4.4 框架中。

它負責無縫地將 TestContext 測試框架移花接木到 JUnit 4.4 測試框架中,它是 Spring TestContext 可以執行起來的根本所在

持有TestContextManager的引用

privatefinal TestContextManager testContextManager;

ContextCache

快取ApplicationContext

ContextLoader

Interface載入context介面

GenericXmlContextLoader為預設的ContextLoader

ApplicationContextAware

自動載入ApplicationContext

AbstractJUnit4SpringContextTests

對集成了Spring TestContext Framework與JUnit 4.4環境中的ApplicationContext測試支援的基本測試類進行了抽取。

當你繼承AbstractJUnit4SpringContextTests時,你就可以訪問到protected的成員變數:

oapplicationContext:使用它進行顯式的bean查詢或者測試整個上下文的狀態。

AbstractTransactionalJUnit4SpringContextTests

對為JDBC訪問增加便捷功能的AbstractJUnit4SpringContextTests事務擴充套件進行抽象。 需要在ApplicationContext中定義一個javax.sql.DataSource bean和一個PlatformTransactionManager bean。

當你繼承AbstractTransactionalJUnit4SpringContextTests類時,你就可以訪問到下列protected的成員變數:

oapplicationContext:繼承自父類AbstractJUnit4SpringContextTests。 使用它執行bean的查詢或者測試整個上下文的狀態

osimpleJdbcTemplate:當通過查詢來確認狀態時非常有用。例如,應用程式碼要建立一個物件, 然後使用ORM工具將其持久化,這時你想在測試程式碼執行前後對其進行查詢,以確定資料是否插入到資料庫中。 (Spring會保證該查詢執行在相同事務內。)你需要告訴你的ORM工具‘flush’其改變以正確完成任務,例如, 使用HibernateSession介面的flush()方法。

提示

這些類僅僅為擴充套件提供了方便。 如果你不想將你的測試類繫結到Spring的類上 - 例如,如果你要直接擴充套件你想測試的類 - 只需要通過@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration@TestExecutionListeners等註解來配置你自己的測試類就可以了。

常用註解

Spring框架在org.springframework.test.annotation包中提供了常用的Spring特定的註解集,如果你在Java5或以上版本開發,可以在測試中使用它。

@IfProfileValue

提示一下,註解測試只針對特定的測試環境。 如果配置的ProfileValueSource類返回對應的提供者的名稱值 這個測試就可以啟動。這個註解可以應用到一個類或者單獨的方法。

@IfProfileValue(name="java.vendor", value="Sun Microsystems Inc.")

publicvoid testJoin() {

System.out.println(System.getProperty("java.vendor"));

}

@ProfileValueSourceConfiguration

類級別註解用來指定當通過@IfProfileValue註解獲取已配置的profile時使用何種ProfileValueSource 如果@ProfileValueSourceConfiguration沒有在測試中宣告,將預設使用SystemProfileValueSource

@ProfileValueSourceConfiguration(CustomProfileValueSource.class)

SystemProfileValueSource中的程式碼

public String get(String key) {

Assert.hasText(key, "'key' must not be empty");

return System.getProperty(key);

}

@DirtiesContext

在測試方法上出現這個註解時,表明底層Spring容器在該方法的執行中被“汙染”,從而必須在方法執行結束後重新建立(無論該測試是否通過)。

@DirtiesContext

publicvoid testJoinC() {

Assert.assertEquals(true, false);

}

@ExpectedException

表明被註解方法預期在執行中丟擲一個異常。預期異常的型別在註解中給定。如果該異常的例項在測試方法執行中被丟擲, 則測試通過。同樣的如果該異常例項沒有在測試方法執行時丟擲,則測試失敗。

@ExpectedException(MemberServiceException.class)

publicvoid testChangePassword() {}

協同使用Spring@ExpectedException註解與JUnit 4@Test(expected=...)會導致一個不可避免的衝突。 因此當與JUnit 4整合時,開發者必須選擇其中一個,在這種情況下建議使用顯式的JUnit 4配置。

@Timed

表明被註解的測試方法必須在規定的時間區間內執行完成(以毫秒記)。如果測試執行時間超過了規定的時間區間,測試就失敗了。

注意該時間區間包括測試方法本身的執行,任何重複測試(參見 @Repeat),還有任何測試fixtureset uptear down時間。

@Timed(millis=100)

publicvoid testPersonByVerifiedMobile(){}

Spring的@Timed註解與JUnit 4的@Test(timeout=...)支援具有不同的語義。 特別地,鑑於JUnit 4處理測試執行超時(如通過在一個單獨的執行緒中執行測試方法)的方式, 我們不可能在一個事務上下文中的測試方法上使用JUnit@Test(timeout=...)配置。因此, 如果你想將一個測試方法配置成計時具事務性的, 你就必須聯合使用Spring@Timed@Transactional註解。 還值得注意的是@Test(timeout=...)只管測試方法本身執行的次數,如果超出的話立刻就會失敗; 然而,@Timed關注的是測試執行的總時間(包括建立和銷燬操作以及重複),並且不會令測試失敗。

@Repeat

表明被註解的測試方法必須重複執行。執行的次數在註解中宣告。

注意重複執行範圍包括包括測試方法本身的執行,以及任何測試fixture的set uptear down

@Test

@Timed(millis=100)

@Repeat(10)

publicvoid testPersonByVerifiedMobile()

@Rollback

表明被註解方法的事務在完成後是否需要被回滾。 如果true,事務將被回滾,否則事務將被提交。 使用@Rollback介面來在類級別覆寫配置的預設回滾標誌。

@Rollback(false)

publicvoid testPersonByVerifiedMobile()

@Transactional

出現該註解表明測試方法必須在事務中執行。

@NotTransactional

出現該註解表明測試方法必須在事務中執行。

@NotTransactional

publicvoid testPersonByVerifiedMobile()

@Autowired

按型別注入(可以寫在屬性上也可以寫在setter)

@Autowired

Join join11;

@Autowired

publicvoid setJoin11(Join join11) {

this.join11 = join11;

}

@Resource

JSR 250中註解. @Autowired類似

@Resource

publicvoid setJoin(Join join) {

this.join = join;

}

@Resource

Join join;

@Autowired @Resource 都可以用來裝配bean.  都可以寫在欄位上,或寫在set方法上

@Autowired (srping提供的預設按型別裝配

@Resource ( j2ee提供的 ) 預設按名稱裝配,當找不到(不寫name屬性)名稱匹配的bean再按型別裝配.

可以通過@Resource(name="beanName") 指定被注入的bean的名稱, 要是指定了name屬性, 就用欄位名去做name屬性值,一般不用寫name屬性.

@Resource(name="beanName")指定了name屬性,按名稱注入但沒找到bean, 就不會再按型別裝配了.

推薦@Autowired @Resource作用有欄位就不用寫set方法了,也不要寫@Resource(name="beanName").

@Retention(RetentionPolicy.RUNTIME)

@Target({ElementType.CONSTRUCTOR, ElementType.FIELD, ElementType.METHOD})

public@interfaceAutowired

@Qualifier

在需要更多控制的時候,任何autowired的域、構造引數、或者方法引數可以進一步加註@Qualifier註解。qualifier可以包含一個字串值,在這種情況下,Spring會試圖通過名字來找到對應的物件。

@Autowired

@Qualifier("join")

Join join111;

@Qualifier作為一個獨立註解存在的主要原因是它可以被應用在構造器引數或方法引數上,但上文提到的@Autowired註解只能運用在構造器或方法本身。

public SpringTest(@Qualifier("join")Join join){

}

看下@Qualifier的定義

@Target({ElementType.FIELD, ElementType.PARAMETER, ElementType.TYPE, ElementType.ANNOTATION_TYPE})

@Retention(RetentionPolicy.RUNTIME)

@Inherited

@Documented

public@interfaceQualifier

相關推薦

spring test+junit+dbunit註解使用說明

Spring TestContext 測試框架體系結構 TestContext 核心類、支援類以及註解類 TestContext 測試框架的核心由 org.springframework.test.context 包中三個類組成,分別是 TestContext 和 TestContextManage

聊聊單元測試(三)——Spring Test+JUnit完美組合

進行 popu transacti csdn 基於 lease 2.4 獲取bean strong 本著“不寫單元測試的程序員不是好程序員”原則,我在堅持寫著單元測試,不敢說所有的Java web應用都基於Spring,但至少

spring-test+JUnit實現springMVC測試用例

        利用spring-test與JUnit來測試程式碼能給我們帶來很多便利,所以簡單寫一篇spring-test與JUnit的測試例項1、加入jar包:<dependency> <groupId>junit</groupId&g

Spring aop 配置和註解詳解

Spring aopaop:(Aspect Oriented Programming)面向切面程式設計,縱向重複,橫向抽取 代理: 生活中的例項:找明星拍戲,上綜藝。拍戲   直接找明星,說明明星太小。如果明星有點名氣,那就不能直接訪問了,必須先通過先訪問明星的經紀人,然後由

將一個類聲Spring的bean的註解小結

數據 簡單 ring 語句 repos 用戶 服務 和數 ice 1.@Repository,這個註解和@Component、@Controller和我們最常見的@Service註解是一個作用,都可以將一個類聲明為一個Spring的Bean。它們的區別到不在於具體的語義上,

Spring Test Dbunit,H2數據庫

float spring 之前 listener hidden ces seo 直接 auto 概述 Dbunit是一個基於JUnit的數據庫集成測試框架。DBUnit 的設計理念就是在測試之前,給對象數據庫植入我們需要的準備數據,最後,在測試完畢後,回溯到測

Spring 常用的註解“依賴註入”的實現

Spring 常用的註解及“依賴註入”1、spring註解@Controller 聲明Action組件@Service 聲明Service組件 @Service("myMovieLister") @Repository 聲明Dao組件@Component 泛指組件, 當不

Junit/idea Junit支持/Spring test之間的孽世糾葛

正是 的人 為什麽 結果 工具 感受 代碼 用例 技術   最近應老板要求,研究研究Spring測試相關的東西,力求搞一個方便使用的測試工具,對於一個Spring不熟Junit不懂的人這是一個很大的坑,掃了一邊spring test文檔沒感覺有什麽收獲,spring做的只是

Spring Test 整合 JUnit 4 使用總結

                這兩天做Web開發,發現通過Spring進行物件管理之後,做測試變得複雜了。因為所有的Bean都需要在applicationContext.xml中載入好,之後再通過@Resource去取得。如果每次都要整個業務流做的差不多了再去測試,這樣效率很低,也很麻煩。如果單獨去寫一個測

Spring的@Resource註解原理

package cn.xhx.spring.di.annotation.test; import org.junit.Test; import org.springframework.context

SSH框架下用JUnitspring-test和EasyMock單元測試

用Junit和EasyMock測試註冊用例說明及結果截圖 1.  沒有相同使用者名稱,可以用該使用者名稱註冊 說明:為需要呼叫的IuserService介面例項建立mock物件,並模擬返回find(查詢資料庫中是否同名)結果為null,即資料庫中 無該使用者名稱,可以註冊 package com.user

Junit 例項精講基礎教程(一) 認識Junit基本註解@Before、@After、@Test、@BeforeClass、@AfterClass

關於Junit,官文甚至不做過多解釋:Junit只是一個用於單元測試的小框架,是基於xUnit架構的一個實現。 系列教程基於Maven。 1. 引入Junit依賴 <dependencies> <dependenc

Junit框架使用(4)--JUnit常用斷言註解

從別人部落格中抄過來一點東西 原文地址:http://blog.csdn.net/wangpeng047/article/details/9628449 斷言是編寫測試用例的核心實現方式,即期望值是多少,測試的結果是多少,以此來判斷測試是否通過。 斷言核心方法

使用 Spring + Mockito+PowerMock +spring-test-dbunit+hsqldb 進行單元測試可實現100%覆蓋率

使用 Mockito 比easyMock 更簡單 使用 PowerMock 可模擬靜態、私有方法 使用spring-test-dbunit 可以實現註解方式匯入xml 到資料庫,為資料庫提供測試資料如: @DatabaseSetup  @DatabaseTearDown

spring aop自動代理註解配置失效問題原理機制整理總結

迭代中遇到的問題處理 問題:用自動代理註解配置攔截了PlanService類的方法testAopFace,方法testAopFace被PlanService類的方法query呼叫。http請求controller後呼叫了方法query,aop對方法testAopFace

Spring第三天:Spring的AOP的註解開發、Spring的聲式事務、JdbcTemplate。

spec template ntc 整合 roman 清晰 定義 method 延伸 1.1 上次課內容回顧 l Spring的IOC的註解開發 n 註解的入門 u 引入aop的包 u 引入context約束 l <context:com

Spring系列之新註解配置+Spring整合junit+註解注入

## Spring系列之註解配置 **Spring是輕程式碼而重配置的框架,配置比較繁重,影響開發效率,所以註解開發是一種趨勢,註解代替xml配置檔案可以簡化配置,提高開發效率** **你本來要寫一段很長的程式碼來構造一個Beam物件,但是如果使用註解的話只要使用一個註解符號即可** ![在這裡插入圖

Spring Boot 之annotation註解

頁面 osi 數據 加載 依賴註入 bsp 類型 數據庫 聲明 一:基於類的註解:(1)初始裝載@SpringBootApplication spring-boot程序入口標誌類@Configuration

spring mvc3.1 @ResponseBody註解生成大量Accept-Charset

ole converter pre catch 字符 註意 trac rri 註解 Spring3 [email protected]/* */(Accept-Charset會達到4K+)。原因在於默認情況下StringHttpMessageConverte

Spring+SpringMVC+MyBatis深入學習搭建(三)——MyBatis全局配置文件解析

保持 nbsp 延遲加載 行為 span 方便 doc ima actor 轉載請註明出處:http://www.cnblogs.com/Joanna-Yan/p/6874672.html 前面有寫到Spring+SpringMVC+MyBatis深入學習及搭建(二)&