1.2 安装测试环境
spring mvc测试框架提供了两种方式,独立安装和集成Web环境测试(此种方式并不会集成真正的web环境,而是通过相应的Mock API进行模拟测试,无须启动服务器)。
独立测试方式
public class UserControllerStandaloneSetupTest {
private MockMvc mockMvc;
@Before
public void setUp() {
UserController userController = new UserController();
mockMvc = MockMvcBuilders.standaloneSetup(userController).build();
}
}
1、首先自己创建相应的控制器,注入相应的依赖
2、通过MockMvcBuilders.standaloneSetup模拟一个Mvc测试环境,通过build得到一个MockMvc
3、MockMvc:是我们以后测试时经常使用的API,后边介绍
集成Web环境方式
//XML风格
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration(value = src/main/webapp)
@ContextHierarchy({
@ContextConfiguration(name = parent, locations = classpath:spring-config.xml),
@ContextConfiguration(name = child, locations = classpath:spring-mvc.xml)
})
//注解风格
//@RunWith(SpringJUnit4ClassRunner.class)
//@WebAppConfiguration(value = src/main/webapp)
//@ContextHierarchy({
// @ContextConfiguration(name = parent, classes = AppConfig.class),
// @ContextConfiguration(name = child, classes = MvcConfig.class)
//})
public class UserControllerWebAppContextSetupTest {
@Autowired
private WebApplicationContext wac;
private MockMvc mockMvc;
@Before
public void setUp() {
mockMvc = MockMvcBuilders.webAppContextSetup(wac).build();
}
}
1、@WebAppConfiguration:测试环境使用,用来表示测试环境使用的ApplicationContext将是WebApplicationContext类型的;value指定web应用的根;
2、@ContextHierarchy:指定容器层次,即spring-config.xml是父容器,而spring-mvc.xml是子容器,请参考《第三章 DispatcherServlet详解 ——跟开涛学SpringMVC》
3、通过@Autowired WebApplicationContext wac:注入web环境的ApplicationContext容器;
4、然后通过MockMvcBuilders.webAppContextSetup(wac).build()创建一个MockMvc进行测试;
到此测试环境就搭建完成了,根据需要选择使用哪种方式即可。相关配置请前往github查看。
1.3、HelloWorld
@Test
public void testView() throws Exception {
MvcResult result = mockMvc.perform(MockMvcRequestBuilders.get(/user/1))
.andExpect(MockMvcResultMatchers.view().name(user/view))
.andExpect(MockMvcResultMatchers.model().attributeExists(user))
.andDo(MockMvcResultHandlers.print())
.andReturn();
Assert.assertNotNull(result.getModelAndView().getModel().get(user));
}
1、mockMvc.perform执行一个请求;
2、MockMvcRequestBuilders.get(/user/1)构造一个请求
3、ResultActions.andExpect添加执行完成后的断言
4、ResultActions.andDo添加一个结果处理器,表示要对结果做点什么事情,比如此处使用MockMvcResultHandlers.print()输出整个响应结果信息。
5、ResultActions.andReturn表示执行完成后返回相应的结果。
整个测试过程非常有规律:
1、准备测试环境
2、通过MockMvc执行请求
3.1、添加验证断言
3.2、添加结果处理器
3.3、得到MvcResult进行自定义断言/进行下一步的异步请求
4、卸载测试环境
对于单元测试步骤请参考:加速Java应用开发速度3——单元/集成测试+CI。
1.4、了解测试API
Spring mvc测试框架提供了测试MVC需要的API,主要包括Servlet/JSP Mock、MockMvcBuilder、MockMvc、RequestBuilder、ResultMatcher、ResultHandler、MvcResult等。另外提供了几个静态工厂方法便于测试:MockMvcBuilders、MockMvcRequestBuilders、MockMvcResultMatchers、MockMvcResultHandlers。在使用时请使用静态方法导入方便测试,如:
import static org.springframework.test.web.servlet.setup.MockMvcBuilders.*; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.*;