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设定档:
建立 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物件。
透过以上步骤建立了一个最简易的MockMvc物件,但通常我们都还有其他额外的配置,假设在测试类别中直接进行配置,则会产生重复的程式码散落,让我们的测试类别变得难以维护。可以透过建立一个共用类别来解决这个问题。
给MockMvc加入额外的配置
建立一个ObjectMother类别,并加入提供各种元件的工厂方法,这使得设定不会散落各地,维护变得容易许多。
加入提供MappingJackson2HttpMessageConverter的方法,用来读写json的常用套件。
加入提供ObjectMapper的方法,转成json时会略过空字串、null等
然后就可以使用MockMvcBuilders.standaloneSetup()回传的StandaloneMockMvcBuilder来进行配置,这边以配置messageConverters来作为例子:
除了setMessageConverters以外,还可以看到StandaloneMockMvcBuilder提供了数种方法让我们来进行配置,如下:
本篇先介绍了Spring Mvc Test Framework主要元件,如何建立MockMvc物件,还有建立一个共用设定的ObjectMother;下一篇就要介绍怎么编写测试类别,使用MockMvc发动mock request,并且验证response。
閱讀更多 Java高級開發工程師 的文章