Spring測試支持和上下文緩存

Spring為單元測試和集成測試提供了全面的支持-通過注釋來加載Spring應用程序上下文,并與JUnit和TestNG等單元測試框架集成。 由于為每個測試加載大型應用程序上下文需要時間,因此Spring智能地為測試套件緩存應用程序上下文–通常,當我們通過ant或maven對項目執行測試時,會創建一個包含項目中所有測試的套件。

我打算在這里介紹一些有關緩存的注意事項,這可能并不全面,但是基于我遇到的某些情況:

1.緩存基于Spring應用程序上下文文件的位置

考慮一個示例Spring配置文件:

<?xml version='1.0' encoding='UTF-8' standalone='no'?>
<beans xmlns='http://www.springframework.org/schema/beans'xmlns:context='http://www.springframework.org/schema/context'xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'xmlns:p='http://www.springframework.org/schema/p'xsi:schemaLocation='http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd'><bean id='user1'  class='org.bk.lmt.domain.TaskUser' p:username='user1' p:fullname='testUser1' /><bean name='user2' class='org.bk.lmt.domain.TaskUser' p:username='user2' p:fullname='testUser' /><bean class='org.bk.contextcaching.DelayBean'/></beans>

還有一個樣本測試,用于加載此上下文文件并進行驗證。

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { 'contexttest.xml' })
public class Test1 {@Autowired Map<String, TaskUser> usersMap;@Testpublic void testGetAUser() {TaskUser user = usersMap.get('user1');assertThat(user.getFullname(), is('testUser1'));}
}

我故意添加了一個bean(DelayBean),它花了大約2秒鐘來實例化,以模擬加載緩慢的Spring Application Context。

如果我現在運行一個帶有兩個測試的小型測試套件,兩個測試都使用相同的應用程序上下文,則行為是第一個測試需要大約2秒鐘才能運行,但是第二個測試由于上下文緩存而很快就可以運行。

如果使用不同的應用程序上下文進行了第三項測試,則該測試將再次花費時間來運行,因為必須加載新的應用程序上下文:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { 'contexttest2.xml' })
public class Test3 {
...
}

2.應用程序上下文的緩存尊重運行測試的活動配置文件–本質上,該配置文件也是Spring用于緩存上下文的內部密鑰的一部分,因此,如果兩個測試使用的是完全相同的應用程序上下文,但不同的配置文件是對于每個測試都處于活動狀態,則緩存的應用程序上下文將不會用于第二個測試:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { 'contexttest.xml' })
@ActiveProfiles('dev1')
public class Test1 {
....
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { 'contexttest.xml' })
@ActiveProfiles('dev2')
public class Test2 {
....

3.即使使用新的@Configuration樣式定義應用程序上下文并在測試中使用它,應用程序上下文的緩存也適用:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes={TestConfiguration.class})
public class Test1 {
...
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes={TestConfiguration.class})
public class Test2 {
....

緩存的一個含義是,如果測試類修改了bean的狀態,則測試套件中使用緩存的應用程序上下文的另一個類將最終看到修改后的bean,而不是在應用程序上下文中定義的bean。 :

例如。 考慮兩個測試,這兩個測試都在上下文中修改了一個bean,但是在狀態中聲明了它在應用程序上下文中定義的方式–在這里,其中一個測試最終會失敗(基于Junit執行測試的順序) ):

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes={TestConfiguration.class})
public class Test1 {@Autowired Map<String, TaskUser> usersMap;@Testpublic void testGetAUser1() {TaskUser user = usersMap.get('user1');assertThat(user.getFullname(), is('testUser1'));user.setFullname('New Name');}@Testpublic void testGetAUser2() {TaskUser user = usersMap.get('user1');assertThat(user.getFullname(), is('testUser1'));user.setFullname('New Name');}
}

解決方法是指示Spring測試支持人員該應用程序上下文現在很臟并且需要為其他測試重新加載,這是通過@DirtiesContext批注完成的,可以在測試類級別或測試方法級別指定該批注。

@Test
@DirtiesContext
public void testGetAUser2() {
...

祝您編程愉快,別忘了分享!

參考: all和其他博客中的JCG合作伙伴 Biju Kunjummen提供的Spring測試支持和上下文緩存 。


翻譯自: https://www.javacodegeeks.com/2012/09/spring-testing-support-and-context.html

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

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

相關文章

perl6正則 4: before / after 代碼斷言: ?{} / !{}

<?before> <? befor XXX> 某字符在 xxx 之前 <?after > <?after XXX> 某字符之后有XXX 對應的取反分別為: <!before > <!before XXX> XXX之前沒有 <!after> <!after xxx> 某字符后面不是 xxx say "foobar" ~~…

mac 下JDK 與 tomcat 的安裝與配置

一.Mac下JDK的安裝 1.先檢測Mac是否已經安裝過JDK&#xff0c;在終端中輸入java 或者 javac 顯示說明&#xff0c;表明已經安裝過JDK&#xff0c;JDK版本查詢終端鍵入java &#xff0d;version&#xff0c;終端會返回JDK的版本號。 2.如果沒有安裝JDK&#xff0c;登陸 http://w…

新型發明創造大賽計算機類,2017年發明杯全國高職高專大學生創新創業大賽

以“發明創新實現夢想、創意創業改變生活”主題活動為依托&#xff0c;把課內與課外教育相結合&#xff0c;學校教育、家庭教育與社會教育相結合&#xff0c;培養廣大在校大學生的科技創新意識和實踐動手能力&#xff0c;激發他們設計創造的樂趣&#xff0c;使廣大大學生大膽創…

如何寫出安全的API接口(參數加密+超時處理+私鑰驗證+Https)- 續(附demo)

轉載&#xff1a;http://www.cnblogs.com/codeon/p/6123863.html 上篇文章說到接口安全的設計思路&#xff0c;如果沒有看到上篇博客&#xff0c;建議看完再來看這個。 通過園友們的討論&#xff0c;以及我自己查了些資料&#xff0c;然后對接口安全做一個相對完善的總結&#…

PrimeFaces在GlassFish 3.1.2.2上推動大氣

PrimeFaces 3.4在三天前問世。 除了通常令人敬畏的新組件和更新組件之外&#xff0c;它還包括新的PrimeFaces Push框架。 基于Atmosphere&#xff0c;這為您的應用程序提供了簡單的推送機制。 這是在最新的GlassFish 3.1.2.2上配置和運行它的方法。 準備工作 像往常一樣&#…

部分視圖跳轉

var album GetDailyDeal(); return PartialView("_DailyDeal", album); 通過NuGet需要添加microsoft.jquery.unobtrusive.ajax 方法一 在BundleConfig.cs 里添加 bundles.Add(new ScriptBundle("~/bundles/jqueryajax").Include("~/Scripts/jquery…

計算機二級目錄設置,word2設置標題格式,生成目錄,奇偶頁設置等等,適用考計算機二級辦公軟件,也適用于畢業論文格式設置...

word2設置標題格式,生成目錄,奇偶頁設置等等,適用考計算機二級辦公軟件,也適用于畢業論文格式設置 這是第2部分word資料 , 跟之前的第一部份word資料合為一份第二題2、在正文前按序插入節&#xff0c;使用“引用”中的目錄功能&#xff0c;生成如下內容&#xff1a;(1) 第1節&a…

JBoss AS 7類加載說明

這是示例章節&#xff0c;摘自Francesco Marchioni編輯的JBoss AS 7 Configuration Deployment and Administration一書&#xff0c;該書正在運行一個名為mastertheboss.com的JBoss門戶。 根據Java EE規范的要求&#xff0c;理想情況下&#xff0c;應用程序服務器應為其部署的應…

打印機 共享 問題

1 用戶提報無法打印&#xff0c;經查被共享打印機無法聯網&#xff0c;先檢查網線是否正常&#xff08;換其他電腦是否能行&#xff09;&#xff0c;再檢查交換機是否正常&#xff0c;經查交換機需要重啟&#xff0c;然后解決問題。 2 被共享機器為32位操作系統&#xff0c;其余…

CoordinatorLayout 中ToolBar遮擋RecyclerView的內容

解決方法:在RecyclerView中添加 app:layout_behavior"string/appbar_scrolling_view_behavior"參考資料:http://stackoverflow.com/questions/32855889/content-behind-coordinatorlayout-appbarlayout 轉載于:https://www.cnblogs.com/niluogege/p/6511094.html

兵團職稱計算機準考證查詢,兵團初級會計準考證打印入口官網

兵團初級會計準考證打印入口官網為財政部會計資格評價中心網(http://kzp.mof.gov.cn)。準考證打印時間在4月16日前公布&#xff0c;考生需要在規定時間登錄財政部會計資格評價中心網(http://kzp.mof.gov.cn)下載并打印準考證。未在上述時限內下載打印準考證的&#xff0c;視作放…

用于集成測試的Maven Cargo插件

在項目生命周期中&#xff0c;非常普遍的需求是設置集成測試。 幸運的是&#xff0c;Maven具有針對此確切方案的內置支持&#xff0c;具有默認構建生命周期的以下階段&#xff08;來自Maven 文檔 &#xff09;&#xff1a; 集成前測試 &#xff1a; 執行集成測試之前所需的操作…

jquery-文檔操作

1.text() 設置或返回元素的text值 <div id"divname">old text</div> $(#divname).text("new text"); 將改變顯示的old為new [1] 參考w3scholl文檔操作 轉載于:https://www.cnblogs.com/hellokittyblog/p/9128397.html

bzoj 4259: 殘缺的字符串

這題好神啊&#xff0c;居然是fft&#xff0c;表示一直在往數據結構上想。 把*當成0&#xff0c;那么兩個串可以匹配當且僅當$$\sum (a[i]-b[i])^2\times a[i]\times b[i]0$$ 我們可以把平方拆開&#xff0c;然后就變成了幾個乘積相加的形式&#xff0c;那就大力翻轉一個串然后…

錄屏時計算機休眠,硬盤錄像機里硬盤提示休眠,什么意思?

休眠&#xff0c;電腦內存中的數據寫入硬盤&#xff0c;關閉電腦。重新啟動的時候重新將數據加載到內存中&#xff0c;恢復休眠前狀態。睡眠&#xff0c;和休眠一個意思&#xff0c;98系統下叫睡眠。xp系統叫休眠。98系統睡眠時&#xff0c;內存數據寫入虛擬內存&#xff0c;xp…

MySQL數據庫的基本操作

-- 連接mysql 數據庫(前提是配置好MySQL數據庫的環境變量&#xff0c;加入path)mysql -uroot -p -- 設置文本的輸入輸出編碼&#xff1a;cmd 使用的是gbk&#xff0c;不然顯示亂碼set names gbk; -- 創建數據庫create database mydatabase charset utf8; -- 創建用戶 user001cr…

使用NoSQL實施實體服務–第5部分:使用云提高自治性

在先前的文章中&#xff0c;我討論了如何通過結合使用Java Web Services &#xff0c; Java EE和CouchDB NoSQL數據庫為產品構建SOA“實體”服務。 在本系列的最后一篇文章中&#xff0c;我將利用我已經創建的一些技術資產&#xff0c;并使用一些流行的SOA模式實現一些新的用戶…

樂高計算機發展史教程,【樂高產品發展史特別篇】樂高恐龍發展史

—— 寫在前面 ——2018年6月22日&#xff0c;《侏羅紀世界2&#xff1a;失落王國》全球上映&#xff1b;4月16日&#xff0c;樂高同名系列套裝全球發售。恐龍是一個伴隨了樂高產品二十余年的主題&#xff0c;其實在一年以前就有這樣一個計劃完成樂高恐龍發展史的相關內容&…

mvc 連接數據庫但單復值得問題

1. The model backing the ‘MusicStoreDBContext‘ context has changed since the database was created. Consider using Code First Migrations to update the database Movie這個表是用來記錄Model的版本號的&#xff0c;你每次重新生成一次數據庫它就會重新給ModelHash…

Mybatis處理表關聯(懶加載)

1.關系型數據庫&#xff1f; 數據庫中的表對象之間是有關系的。 一對一&#xff0c;一對多&#xff0c;多對多。 ORM映射。數據庫表映射到實體對象。 實體與實體之間是有關系的。 一對多的關系。 比如商品分類表與商品表之間的關系&#xff0c;就是一對多的關系。 入庫主表與入…