Spring 5 中文解析測試篇-Spring測試

Spring核心篇章:html

Spring 5 中文解析之核心篇-IoC容器java

Spring 5 中文解析核心篇-IoC容器之依賴關係react

Spring 5 中文解析核心篇-IoC容器之Bean做用域git

Spring 5 中文解析核心篇-IoC容器之自定義Bean性質web

Spring 5 中文解析核心篇-IoC容器之BeanDefinition繼承與容器拓展點spring

Spring 5 中文解析核心篇-IoC容器之基於註解的容器配置編程

Spring 5 中文解析核心篇-IoC容器之類路徑掃描和組件管理api

Spring 5 中文解析核心篇-IoC容器之JSR330標準註解spring-mvc

Spring 5 中文解析核心篇-IoC容器之基於Java容器配置服務器

Spring 5 中文解析核心篇-IoC容器之Environment抽象

Spring 5 中文解析核心篇-IoC容器之ApplicationContext與BeanFactory

Spring 5 中文解析核心篇-IoC容器之Resources

Spring 5 中文解析核心篇-IoC容器之數據校驗、數據綁定和類型轉換

Spring 5 中文解析核心篇-IoC容器之SpEL表達式

Spring 5 中文解析核心篇-IoC容器之AOP編程(上)")

Spring 5 中文解析核心篇-IoC容器之AOP編程(下)")

Spring 5 中文解析核心篇-IoC容器之Spring AOP API

完整電子書地址

前面Spring核心已經完結請查看前面文章。接下來咱們繼續Spring中的測試篇。

測試

本章介紹了Spring對集成測試的支持以及單元測試的最佳實踐。Spring團隊提倡測試驅動開發(TDD)。Spring的團隊發現,正確使用控制反轉(IoC)的確是簡化單元測試和集成測試(setter方法和適當的構造函數類的存在使他們更容易鏈接在一塊兒測試,而無需創建服務定位器註冊中心和相似的結構)。

1 Spring測試介紹

測試是企業軟件開發的組成部分。本章重點介紹IoC原則爲單元測試帶來的附加價值,以及Spring框架對集成測試的支持所帶來的好處。(對企業中測試的完全處理不在本參考手冊的範圍以內。)

2 單元測試

與傳統的Java EE開發相比,依賴注入應該使你的代碼對容器的依賴程度下降。組成應用程序的POJO應該能夠在JUnit或TestNG測試中進行測試,而且可使用new運算符實例化對象,而無需使用Spring或任何其餘容器。你可使用mock對象(結合其餘有價值的測試技術)單獨測試代碼。若是你遵循Spring的體系結構建議,那麼代碼庫的最終分層和組件化將使單元測試更加容易。例如,你能夠經過存根或模擬DAO或存儲庫接口來測試服務層對象,而無需在運行單元測試時訪問持久性數據。

真正的單元測試一般運行很是快,由於沒有可設置的運行時基礎架構。將真正的單元測試做爲開發方法的一部分能夠提升生產率。你可能不須要測試章節的這一部分來幫助你爲基於ioc的應用程序編寫有效的單元測試。然而,對一些單元測試場景,Spring框架提供了mock對象和測試支持類,它們在這個章節描述。

2.1 Mock對象

Spring包含許多專用於mock的包:

2.1.1 Environment

org.springframework.mock.env包包含EnvironmentPropertySource抽象mock實現(請參閱Bean定義配置文件和PropertySource抽象)。MockEnvironmentMockPropertySource對於爲依賴於特定環境屬性的代碼開發<u>容器外測試</u>很是有用。

2.1.2 JNDI

org.springframework.mock.jndi包包含JNDI SPI的部分實現,可用於爲測試套件或獨立應用程序設置簡單的JNDI環境。例如,若是JDBC DataSource實例在測試代碼中與在Java EE容器中綁定到相同的JNDI名稱,則能夠在測試場景中重用應用程序代碼和配置,而無需進行修改。

從Spring框架5.2開始,正式棄用了 org.springframework.mock.jndi包中的mock JNDI支持,而但願使用第三方的完整解決方案,例如 Simple-JNDI
2.1.3 Servlet API

org.springframework.mock.web包包含一組全面的Servlet API模擬對象,這些對象對於測試Web上下文,控制器和過濾器很是有用。這些模擬對象是針對Spring的Web MVC框架使用的,一般比動態模擬對象(例如EasyMock)或其餘Servlet API模擬對象(例如MockObjects)更方便使用。

從Spring框架5.0開始, org.springframework.mock.web中的模擬對象基於Servlet 4.0 API。

Spring MVC測試框架創建在模擬Servlet API對象的基礎上,爲Spring MVC提供了集成測試框架。參見Spring MVC測試框架

2.1.4 Spring Web Reactive

org.springframework.mock.http.server.reactive包包含ServerHttpRequestServerHttpResponse的mock實現,供WebFlux應用程序使用。org.springframework.mock.web.server包包含一個模擬ServerWebExchange,它依賴於那些模擬請求和響應對象。

MockServerHttpRequestMockServerHttpResponse都從與特定於服務器的實現相同的抽象基類擴展,並與它們共享行爲。例如,模擬請求一旦建立即是不可變的,可是你可使用ServerHttpRequest中的mutate()方法來建立修改後的實例。

爲了使模擬響應正確實現寫契約並返回寫完成句柄(即Mono <Void>),默認狀況下,它使用帶有Fluxcache().then()來對數據進行緩衝並使其可用於測試中的斷言。應用程序能夠設置自定義編寫函數(例如,測試一個無限流)。

WebTestClient創建在模擬請求和響應的基礎上,爲不使用HTTP服務器的WebFlux應用程序測試提供支持。客戶端還能夠用於正在運行的服務器的端到端測試。

2.2 單元測試支持類

Spring包含許多能夠幫助進行單元測試的類。它們分爲兩類:

2.2.1 通用測試工具

org.springframework.test.util包包含幾個通用的實用程序用於單元測試和集成測試。

ReflectionTestUtils是基於反射的實用程序方法的集合。在須要更改常量值、設置非公共字段、調用非公共setter方法或調用非公共配置或生命週期回調方法的測試場景中,你可使用這些方法

  • ORM框架(如JPA和Hibernate)容許privateprotected的字段訪問,而不是域實體中的屬性的public setter方法。
  • Spring支持註解(例如@Autowired@Inject@Resource),這些註解爲privateprotected的字段,setter方法和配置方法提供依賴項注入。
  • 使用例如@PostConstruct@PreDestroy之類的註解用於生命週期回調方法。

AopTestUtils是與AOP相關的實用程序方法的集合。你可使用這些方法來獲取對隱藏在一個或多個Spring代理後面的基礎目標對象的引用。例如,若是你已經經過使用庫(如EasyMockMockito)將bean配置爲動態mock,而且該mock包裝在Spring代理中,那麼你可能須要直接訪問底層的mock,以在其上配置指望並執行驗證。有關Spring的核心AOP實用程序,請參閱AopUtilsAopProxyUtils

2.2.2 Spring MVC 測試工具

org.springframework.test.web包包含ModelAndViewAssert,你能夠將其與JUnit、TestNG或任何其餘測試框架結合使用,以進行處理Spring MVC ModelAndView對象的單元測試。

單元測試Spring MVC控制器

要對做爲POJO的Spring MVC Controller類進行單元測試,請將ModelAndViewAssert與Spring的Servlet API模擬中的MockHttpServletRequestMockHttpSession等結合使用。爲了與Spring MVC的WebApplicationContext配置一塊兒對Spring MVC和REST Controller類進行全面的集成測試,請改用Spring MVC測試框架。

做者

我的從事金融行業,就任過易極付、思建科技、某網約車平臺等重慶一流技術團隊,目前就任於某銀行負責統一支付系統建設。自身對金融行業有強烈的愛好。同時也實踐大數據、數據存儲、自動化集成和部署、分佈式微服務、響應式編程、人工智能等領域。同時也熱衷於技術分享創立公衆號和博客站點對知識體系進行分享。關注公衆號: 青年IT男 獲取最新技術文章推送!

博客地址: http://youngitman.tech

CSDN: https://blog.csdn.net/liyong1...

微信公衆號:

技術交流羣:

相關文章
相關標籤/搜索