Spring 測試 - Spring 文檔 5.1.6

這個章節(jié)包含了 Spring 對集成測試的支持和單元測試的最佳實踐。Spring 團隊提倡測試驅(qū)動開發(fā)(TDD),他們已發(fā)現(xiàn)通過正確使用控制反轉(zhuǎn)(IoC)的確可以讓單元測試和集成測試變得更簡易(已有 setter 和合適的構(gòu)造器,因此更容易結(jié)合到測試中,而不需要設置服務注冊器等相似結(jié)構(gòu))。

1. Spring 測試簡介

測試是企業(yè)級軟件開發(fā)必備的一部分。這個章節(jié)關(guān)注于 Ioc 原則給單元測試帶來的價值,以及 Spring 框架對集成測試支持的優(yōu)點。(企業(yè)中一個完整測試處理的范圍會多于此參考手冊)。

2. 單元測試

相對于傳統(tǒng) Java EE 開發(fā),依賴注入會讓你的代碼更少地依賴于容器。即使不使用 Spring 或其他容器,通過 JUnit 或 TestNG 以及new實例化的對象,構(gòu)成應用的 POJO 類也應是可測試的。你可以使用 “模擬對象”,與其他測試技術(shù)相結(jié)合,來隔離地測試你的代碼。如果你遵循 Spring 推薦結(jié)構(gòu),那么簡潔的分層和組件化能讓你的代碼庫更易于單元測試。比如,你能在去除或模擬 DAO 接口的情況下測試 service 層對象,無需訪問持久層數(shù)據(jù)。

2.1. 模擬對象(Mock Objects)

Spring 包括若干用于模擬對象的包:

  • Environment
  • JNDI
  • Servlet API
  • Spring Web Reactive

2.1.1. Environment

org.springframework.mock.env包含對環(huán)境和配置源的模擬實現(xiàn)(可參考 Spring Bean 定義和配置源抽象類)。環(huán)境和配置源模擬很適合開發(fā) 無容器測試 和 依賴特定環(huán)境 的代碼。

2.1.2. JNDI

org.springframework.mock.jndi包含了 JNDI(Java命名和目錄接口)的實現(xiàn),你可以為測試套件或獨立應用設置簡易的 JNDI 環(huán)境。例如,如果你的 JDBC 數(shù)據(jù)源使用了和測試代碼中一樣的 JNDI 命名風格,你就能在測試場景中復用應用代碼而無需修改。

2.1.3. Servlet API

org.springframework.mock.web包含了全面的 Servlet API 對象模擬,可用于測試 Web 上下文,Controller 接口,F(xiàn)ilter 過濾器。這些模擬對象關(guān)注于 Spring MVC 框架,并且相比動態(tài)模擬對象(如 EasyMock)更加易用。

從 Spring 5.0 起, org.springframework.mock.web 中的對象模擬都是基于 Servlet 4.0 API 的。

2.1.4. Spring Web Reactive

org.springframework.mock.http.server.reactive中包含了模擬Servlet 的 HTTP 請求和響應的實現(xiàn),可用于 WebFlux 應用。org.springframework.mock.web.server 包括了模擬 ServerWebExchange 的請求和響應的支持。
繼承同一基類的 MockServerHttpRequest 和 MockServerHttpResponse 有相同的服務端實現(xiàn)和行為。例如,一個模擬請求在創(chuàng)建后就是不可變的,但可以通過調(diào)用 mutate() 方法,來創(chuàng)建可修改實例。
為了讓模擬響應正確地輸出并返回完成句柄,默認通過 cache().then() 使用了流,能夠緩存數(shù)據(jù)并用于測試斷言。應用可以給響應設置自定義輸出函數(shù)(比如無限的輸出流)。
模擬響應和請求的 WebTestClient 提供了無需 HTTP 服務端情況下,測試 WebFlux 應用的支持。它也可以用于運行中服務器的端到端測試。

2.2. 單元測試支持類

Spring 提供了若干可用于單元測試的類,分為兩類:

  • 通用測試工具類
  • Spring MVC 測試工具類

2.2.1. 通用測試工具類

org.springframework.test.util 包含了一些一般用途的單元測試和集成測試工具類。

ReflectionTestUtils 是基于反射的工具方法集??梢杂迷谛枰薷某A俊⑿薷姆枪矊傩?、調(diào)用非公共方法、調(diào)用生命周期方法的測試場景。如:

  • ORM 框架(如 JPA 和 Hibernate)下,領(lǐng)域?qū)嶓w中私有或受保護的字段。
  • Spring 的注解支持(如 @Autowired,@Inject,@Resource),可以提供對私有或受保護字段、配置方法的依賴注入。
  • 使用如 @PostConstruct 和 @PreDestroy 作為生命周期的調(diào)用。

AopTestUtils是AOP切面有關(guān)的工具方法集。你可以用這些方法來獲得 Spring 代理下目標對象的引用。例如,如果你使用 EasyMock 或 Mockito 配置了一個一個動態(tài)模擬對象,它是被 Spring 代理的,而你可能需要直接訪問內(nèi)在對象設置預期、執(zhí)行驗證。對于 Spring 的核心 AOP 工具類,可參考 AopUtilsAopProxyUtils。

2.2.2. Spring MVC 測試工具類

org.springframework.test.web包含了ModelAndViewAssert,可結(jié)合 Junit,TestNG 或其他框架來為模型和視圖做單元測試。


譯自:
Testing - Spring Framework Documentation

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容