1、Controller
@RestController
public class HelloController {
@RequestMapping("/hello")
public String hello() {
return "Hello";
}
}
1.1 @RestController
- @RestController = @ResponseBody + @Controller
- @RestController 主要返回JSON形式的数据,用于Ajax请求;如果要返回需要视图解析器解析的页面,使用 @Controller注解。
1.2 @RequestMapping
-
标注在类上:指定类内方法的统一路径前缀
-
标注在方法上:该方法的请求路径
-
参数:value 指定路径(数组),method 请求方式,如
RequestMethod.GET
-
配合
@PathVaraible
注解一起使用,用来处理动态的 URI@RequestMapping(value = "/fetch/{id}", method = RequestMethod.GET) String getDynamicUriValue(@PathVariable String id) { System.out.println("ID is " + id); return "Dynamic URI"; } // 正则表达式匹配请求路径 // 可匹配:/fetch/category/shirt // 不可匹配:/fetch/10/shirt @RequestMapping(value = "/fetch/{id:[a-z]+}/{name}") String getDynamicUriValueRegex(@PathVariable("name") String name) { System.out.println("Name is " + name); return "Dynamic URI parameter fetched using regex"; }
-
注解变体
- @GetMapping
- @PostMapping
- @PutMapping
- @DeleteMapping
2、测试Controller
@RunWith(SpringRunner.class)
@SpringBootTest
public class HelloControllerTest {
private MockMvc mvc;
@Before
public void setUp(){
// 注意:这里参数 new 的是要测试的Controller对象
mvc = MockMvcBuilders.standaloneSetup(new HelloController()).build();
}
@Test
public void hello() throws Exception {
mvc.perform(MockMvcRequestBuilders.get("/hello").accept(MediaType.APPLICATION_JSON))
.andExpect(MockMvcResultMatchers.status().isOk())
.andDo(MockMvcResultHandlers.print())
.andReturn();
}
}
2.1 @RunWith
@RunWith
一个运行器,@RunWith(SpringRunner.class),测试时启动Spring运行的上下文,SpringRunner
是SpringJUnit4ClassRunner
的一个别名。
2.2 @SpringBootTest
配置文件属性的读取、加载,启动web服务器并定义和监听端口等 springboot测试服务环境。
-
@ContextConfiguration
手动指定配置文件的位置,常见于SSM框架项目的测试。
2.3 @Before
在每个测试方法之前都要运行的方法。
2.4 MockMvc
MockMvc是服务端 Spring MVC测试支持的主入口点。可以用来模拟客户端请求,用于测试。
-
构造MockMvc对象
独立安装Web模拟测试环境,xxx 待测试控制器类对象
MockMvcBuilders.standaloneSetup(xxx).build();
-
perform
执行一个请求
-
MockMvcRequestBuilders.get(“xxx”)
构造一个请求,返回类型:
MockHttpServletRequestBuilder
-
MockHttpServletRequestBuilder
请求对象类
方法:
accept(MediaType… mediaTypes) : 指定请求的Accept(获取)头信息
content(byte[] content):指定请求Body体内容
… …
3、常用测试
3.1 测试普通控制器
mockMvc.perform(get("/user/{id}", 1)) // 得到执行请求
// 验证存储模型数据
.andExpect(MockMvcResultMatchers.model().attributeExists("user"))
// 验证viewName
.andExpect(MockMvcResultMatchers.view().name("user/view"))
// 验证视图渲染时forward到的jsp
.andExpect(MockMvcResultMatchers.forwardedUrl("/WEB-INF/xxx.jsp"))
// 验证状态码
.andExpect(MockMvcResultMatchers.status().isOk())
// 输出MvcResult到控制台 注意是:MockMvcResultHandlers
.andDo(MockMvcResultHandlers.print());
3.2 得到MvcResult自定义验证
MvcResult result = mockMvc.perform(get("/user/{id}", 1))//执行请求
.andReturn(); //返回MvcResult
Assert.assertNotNull(result.getModelAndView().getModel().get("user")); //自定义断言
3.3 post传参
mvc.perform(MockMvcRequestBuilders.post("/hello")
.param("name", "荆轲")
.param("author", "aa", "bb")
.accept(MediaType.APPLICATION_JSON))
.andExpect(MockMvcResultMatchers.status().isOk());
4、banner
springboot 自带banner
-
自定义banner
在类路径下添加自己的 banner.txt 或 banner.git等即可。
参考
[1] @RequestMapping详解
[2] MockMVC - 基于RESTful风格的SpringMVC的测试
[3] spring-boot-examples