Spring MVC Controller Unit Test(一)

Spring MVC Controller Unit Test(一)

Spring是当前Java界最重要的框架(没有之一),除了核心模组带来的容器、控制反转、AOP的概念以外,还有各式各样的强大可选模组,是一个为企业应用不断带来火力支援的开源框架。



本篇章要介绍如何透过Spring MVC Test Framework来编写单元测试。

因为个人使用的网站架构是前后端分离(篇幅不够),所以将会着重于研究如何测试RESTful API式的Spring Controller。另外,使用的Spring为4.2.X,并且没有使用Spring Boot。

Spring Mvc Test Framework简介

支援JUnit与TestNG

建立在Spring-test提供的Servlet API模拟物件之上,因此不需正在执行的Servlet container

它使用DispatcherServlet提供完全的Spring MVC执行时期行为的支援。

可以使用独立配置或基于Web context的设定来配置待测系统

Spring MVC Test Framework主要元件介绍

想要设定Spring MVC context时,则使用以下元件

MockMvcBuilders类别提供建立MockMvc物件的静态方法。

MockMvc物件就像一个可以处理http request的controller模拟

有两种设定Spring MVC基础配置的方式

独立配置。使用MockMvcBuilders类别提供的方法standaloneSetup(controller)回传的物件StandaloneMockMvcBuilder来自行设定。 (建议)

基于设定好的Context配置。使用MockMvcBuilders类别提供的方法webAppContextSetup来传入设定好的WebApplicationContext或xml设定档进行设定。

想要模拟发送http request,并为回传的response编写断言,则使用以下元件

MockMvcRequestBuilders类别提供了静态方法,可以建立http request并发送。

MockMvcResultMatchers类别提供了静态方法,可以使用它来为回传的Http response编写断言。

MockMvcResultHandlers类别提供了静态方法,可以使用这些方法来印出回传的response。

想要使用Spring MVC Test Framework来编写单元测试,必须先载入spring-test,在这里列出完整的gradle设定档:

Spring MVC Controller Unit Test(一)

建立 MockMvc

编写Controller单元测试时,一开始必须建立一个新的MockMvc物件,作为测试的进入点,在这里将会使用MockMvcBuilders.standaloneSetup(controller)进行独立配置。

PS如果透过MockMvcBuilders.webAppContextSetup()来读取Context Configuration类别或Xml设定档进行配置,这意味着设定档必须为了符合测试而进行调整,但实际上每一个Controller可能具有不同的context配置或者测试替身必须建立的复杂情境,所以这里选用独立配置的方式来进行。并且因为不使用SpringJUnit4ClassRunner,得以让我们使用HierarchicalContextRunner来编写巢状单元测试。

以下以最简单的方式建立一个MockMvc物件作为示范:

1.建立IssueController的测试类别IssueControllerTest

2.加入属性MockMvc

3.建立@Before setup方法,在每个测试案例之前建立新的MockMvc物件

4.建立待测的IssueController物件,并传入MockMvcBuilders.standaloneSetup()进行设定,并回传StandaloneMockMvcBuilder类别。

5.透过StandaloneMockMvcBuilder设定其他Web Context配置如ObjectMapper、LocaleResolver,最后使用方法build()建立MockMvc物件。

Spring MVC Controller Unit Test(一)

透过以上步骤建立了一个最简易的MockMvc物件,但通常我们都还有其他额外的配置,假设在测试类别中直接进行配置,则会产生重复的程式码散落,让我们的测试类别变得难以维护。可以透过建立一个共用类别来解决这个问题。

给MockMvc加入额外的配置

建立一个ObjectMother类别,并加入提供各种元件的工厂方法,这使得设定不会散落各地,维护变得容易许多。

加入提供MappingJackson2HttpMessageConverter的方法,用来读写json的常用套件。

加入提供ObjectMapper的方法,转成json时会略过空字串、null等

Spring MVC Controller Unit Test(一)

然后就可以使用MockMvcBuilders.standaloneSetup()回传的StandaloneMockMvcBuilder来进行配置,这边以配置messageConverters来作为例子:

Spring MVC Controller Unit Test(一)

除了setMessageConverters以外,还可以看到StandaloneMockMvcBuilder提供了数种方法让我们来进行配置,如下:

Spring MVC Controller Unit Test(一)

本篇先介绍了Spring Mvc Test Framework主要元件,如何建立MockMvc物件,还有建立一个共用设定的ObjectMother;下一篇就要介绍怎么编写测试类别,使用MockMvc发动mock request,并且验证response。


分享到:


相關文章: