14.單元測試
依賴注入讓你的代碼更少地依賴容器,這不同於傳統的Java EE開發。組成應用程序的POJO應當能在JUnit或TestNG測試框架中進行測試,對象只需使用new運算符實例化,而無需Spring或任何其他容器。開發者可以使用mock對象(第14.1節)(與其他有用的測試技術協同) 來隔離測試代碼。如果遵循Spring的體系結構的建議,那麼編寫層次清晰和組件化的代碼能更便於單元測試。例如,可以通過tubbing、mock DAO或Repository接口對服務層對象進行測試,而無需在運行單元測試時訪問持久化數據。
真正的單元測試一般都運行得飛快,因爲在運行時無需再作配置。將這種真正的單元測試作爲開發方法的一部分能提高開發者的效率。也許你無需閱讀“測試”這一章節來幫助你編寫基於IoC的單元測試。但是,對於某些單元測試方案,Sping框架提供了以下mock對象和測試支持類。
14.1 mock對象
14.1.1 環境
org.springframework.mock.env
包包含環境和PropertySource
抽象的mock實現(請參看第7.13.1節“bean定義的profiles”和第7.13.2節“PropertySource抽象”)。MockEnvironment
和MockPropertySource
對於開發依賴於環境特定屬性的代碼的外測試非常有用。
14.1.2 JNDI
org.springframework.mock.jndi
包中包含JNDI SPI的實現,開發者可以使用該實現爲測試套件或獨立應用程序設置簡單的JNDI環境。例如,如果JDBC DataSources在測試代碼與Java EE容器中的JNDI名稱綁定到相同的名稱,那麼可以在測試場景中複用應用程序代碼和配置,而無需進行修改。
14.1.3 Servlet API
org.springframework.mock.web
包包含一組全面的Servlet API mock對象,這些對象有用於測試Web上下文、控制器和過濾器。這些mock對象是針對Spring Web MVC框架使用的,通常比動態mock對象(例如easymock)或其他Servlet API mock對象(例如MockObjects
)更方便。從Spring 4.0框架開始, org.springframework.mock.web
包中的一組mock基於Servlet 3.0 API。
有關Spring MVC和REST控制器與Spring MVC的WebApplicationContext
配置進行全面集成測試,請參看Spring MVC Test Framework(第15.6節)。
14.2 單元測試支持類
14.2.1 通用的測試工具
org.springframework.test.util
包包含一些用於單元和集成測試的通用工具。
ReflectionTestUtils
是基於反射的工具方法集合。開發者在測試需要更改常量值、設置非公共字段、調用非公共 setter 方法或調用非公共配置或生命週期回調方法的場景中,在涉及測試用例的應用程序代碼時,都可以使用這些方法。
- ORM框架(例如JPA和Hibernate)用到private或protected的字段訪問,而不是在公共的setter方法設置實體屬性。
- Spring對註解的支持(例如@Autowired、@Inject和@Resource等)爲聲明爲private或protected的字段、setter方法和配置方法提供依賴注入。
- 使用註解(例如@PostConstruct和@PreDestroy等)用於生命週期的回調方法。
AopTestUtils
是與AOP相關的工具方法集合。這些方法可用於獲取對隱藏在一個或多個Spring代理後面的底層目標對象的引用。例如,如果已經使用EasyMock或Mockito等庫將bean配置爲動態mock,並且包裝在Spring代理中,當需要直接訪問它們判斷配置是否正確或執行驗證時,這些方法就派上用場。有關Spring的核心AOP實用工具,請參看AopUtils
和AopProxyUtils
。
14.2.2 Spring MVC
org.springframework.test.web
包包含ModelAndViewAssert
,開發者可以將它配合JUnit
、TestNG
或其他測試框架一起使用,用於處理Spring MVC ModelAndView對象的單元測試。
提示:如果想將Spring MVC Controller作爲POJO進行單元測試,請在Spring的Servlet API Mocks(第14.1.3節)中將
ModelAndViewAssert
配合MockHttpServletRequest
、MockHttpSession
等框架一起使用。有關Spring MVC和REST控制器與Spring MVC的 WebApplicationContext配置進行全面集成測試,請改用Spring MVC測試框架(第15.6節)。