天天看點

《Spring 5官方文檔》11內建測試(一)

11.1 概述

能夠在不需要部署到應用伺服器或連接配接到其它企業基礎服務的前提下做一些內建測試是很重要的。這将使你能夠測試以下内容:

spring ioc容器上下文的正确裝配。

使用jdbc或其它orm工具通路資料。這将包括sql語句、hibernate查詢和jpa實體映射的正确性等等這些内容。

11.2 內建測試的目标

spring的內建測試支援有以下幾點主要目标:

下面幾節将解釋每個目标并提供實作和配置詳情的連結。

11.2.1 上下文管理和緩存

spring testcontex架構對spring applicationcontext 和webapplicationcontext提供一緻性加載并對它們進行緩存。對加載的上下文進行緩存提供支援是很重要的,因為啟動時間是個問題——不是因為spring自己的開銷,而是被spring容器初始化的對象需要時間去初始化。比如,一個擁有50到100個hibernate映射檔案的項目可能花費10到20秒的時間去載這些映射檔案,在運作每一個測試工具中的測試用例之前都會引發開銷并導緻總體測試運作變緩慢,降低開發效率。

測試類通常聲明一批xml的資源路徑或者groovy的配置中繼資料——通常在類路徑中——或者是一批用于配置應用程式的注解類。這些路徑或者類跟在web.xml或者其它用于生産部署的配置檔案中指定的是一樣的。

通常,一旦被加載過一次,applicationcontext就将被用于每個測試中。是以啟動開銷在一次測試集中将隻會引發一次,随後執行的測試将會快得多。在這裡,“測試集”的意思是在同一個jvm的所有測試——比如說,對給定項目或者子產品的一次ant、maven或者gradle建構運作的所有測試。在不太可能的情況下,一個測試會破壞應用上下文并引起重新加載——比如,修改一個bean定義或者應用程式對象的狀态——testcontex架構将被設定為在開始下個測試之前重新加載配置并重建應用上下文。

11.2.2 測試配置的信賴注入

當testcontext架構加載你的應用程式上下文的時候,它将通過信賴注入有選擇性地配置測試執行個體。這為使用你的應用程式上下文中的預配置bean來建立測試配置提供了一個很友善的機制。這裡有一個很大的便處就是你可以在不同的測試場景中重複使用應用程式上下文(比如,配置基于spring管理的對象圖、事務代理、資料源等等),這樣省去了為每個測試用例建立複雜的測試配置的必要。

舉例說明,考慮這樣一個場景,我們有一個類叫做hibernatetitlerepository,它實作了title領域實體的資料通路邏輯。我們想編寫內建測試來測試以下方面:

spring配置:總的來說,就是與hibernatetitlerepository配置有關的一切是否正确和存在?

hibernate映射檔案:是否所有映射都正确,并且延遲加載的設定是否準備就緒?

hibernatetitlerepository的邏輯:此類中的配置執行個體是否與預期一緻?

11.2.3 事務管理

測試中通路一個真實資料庫的一個常見的問題是在持久層存儲狀态付出的努力。即使你使用開發環境的資料庫,改變相應的狀态也會影響将來的測試。并且,許多操作——插入或者改變持久層資料——也不能在事務之外執行(或者驗證)。

testcontext架構解決了這個問題。預設行為下,這個架構将為每個測試建立并復原一個事務。你隻需簡單的假定事務是存在的并寫你的代碼即可。如果你調用事務代理對象,他們也會根據它們配置的語義正确執行。而且,如果一個測試方法在運作相應事務時删除了標明表中的内容,事務預設情況下會進行復原,資料庫會回到測試執行前的那個狀态。事務通過定義在應用程式上下文中的platformtransactionmanager bean來得到支援。

如果你需要送出事務——通常不會這樣做,但有時當你想用一個特定的測試來填充或者修改資料庫時也會顯得有用——testcontext架構将根據@commit注解的訓示對事務進行送出而不是復原。

11.2.3 內建測試的支援類

spring testcontext架構提供了一些支援來簡化內建測試的編寫。這些基礎類為測試架構提供了定義良好的鈎子,還有一些便利的執行個體變量和方法,使你能夠通路:

applicationcontext,用于從整體上來進行顯示的bean查找或者測試上下文的狀态。

jdbctemplate,用于執行sql語句來查詢資料庫。這些的查詢可用于确認執行資料庫相關的應用程式代碼前後資料庫的狀态,并且spring保證這些查詢與應用程式代碼在同一個事務作用域中執行。如果需要與orm工具協同使用,請確定避免誤報。

還有,你可能想用特定于你的項目的執行個體和方法來建立你自己自定義的,應用程式範圍的超類。