说明如何用 spring 进行单元测试
前言
spring mvc mock 测试
基于 rest 的 spring mvc 的测试,可以测试完整的 spring mvc 流程,即从 url 请求到控制器处理,再到视图渲染都可以测试。MockMvcBuilder 是用来构造 mock mvc 的构造器,其主要有两个实现:StandaloneMockMvcBuilder 和 DefaultMockMvcBuilder,分别对应独立安装和集成 web 测试。独立安装测试会启动一个 web 服务器,而集成 web 测试通过相应的 mock api 进行模拟测试,不会启动服务器,一般使用集成 web 测试就可以了。
集成 web 环境方式示例
1 | import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; |
说明
MockMvc.perform 方法用于执行测试,perform 方法接收一个 RequestBuilder 参数,返回 ResultActions
RequestBuilder 可以由 MockMvcRequestBuilders 中的 get, post 等静态工厂方法产生,它们与 http method 一一对应。 get, post 等方法返回 MockHttpServletRequestBuilder, MockHttpServletRequestBuilder 提供方法用于修改 http 请求,例如设置 header,body 等
ResultActions 提供 3 个操作:
- ResultActions andExpect(ResultMatcher matcher):添加断言测试结果是否符合预期
ResultMatcher 用来做响应结果验证,可以用 MockMvcResultMatchers 中的静态工厂方法产生具体实例 - ResultActions andDo(ResultHandler handler):添加结果处理器,用于对验证成功后执行的动作
ResultHandler 是结果处理,由用户自定义 - MvcResult andReturn():获取返回的结果,可用于进一步的测试
示例
- 测试普通控制器
1 | mockMvc.perform(get("/user/{id}", 1)) // 执行请求 |
- 用得到 MvcResult 进行自定义验证
1 | MvcResult result = mockMvc.perform(get("/user/{id}", 1)) // 执行请求 |
- 文件上传
1 | byte[] bytes = new byte[] {1, 2}; |
- 异步测试
1 | MvcResult result = mockMvc.perform(get("/user/async1?id=1&name=zhang")) // 执行请求 |
spring 中使用 mockito
mockito 是 mocking 框架。在写单元测试的过程中,可能遇到要测试的类有很多依赖,这些依赖的类/对象/资源又有别的依赖,从而形成一个大的依赖树,mockito 就是用来模拟依赖,从而简化测试的编写。
1 |
|