SpringBoot03: 测试Controller

1、Controller

@RestController
public class HelloController {
    @RequestMapping("/hello")
    public String hello() {
        return "Hello";
    }
}
1.1 @RestController
  1. @RestController = @ResponseBody + @Controller
  2. @RestController 主要返回JSON形式的数据,用于Ajax请求;如果要返回需要视图解析器解析的页面,使用 @Controller注解
1.2 @RequestMapping
  1. 标注在类上:指定类内方法的统一路径前缀

  2. 标注在方法上:该方法的请求路径

  3. 参数:value 指定路径(数组),method 请求方式,如 RequestMethod.GET

  4. 配合@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";  
    }  
    
  5. 注解变体

    • @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运行的上下文,SpringRunnerSpringJUnit4ClassRunner的一个别名。

2.2 @SpringBootTest

​ 配置文件属性的读取、加载,启动web服务器并定义和监听端口等 springboot测试服务环境。

  • @ContextConfiguration

    手动指定配置文件的位置,常见于SSM框架项目的测试。

2.3 @Before

​ 在每个测试方法之前都要运行的方法。

2.4 MockMvc

​ MockMvc是服务端 Spring MVC测试支持的主入口点。可以用来模拟客户端请求,用于测试。

  1. 构造MockMvc对象

    独立安装Web模拟测试环境,xxx 待测试控制器类对象

    MockMvcBuilders.standaloneSetup(xxx).build();

  2. perform

    执行一个请求

  3. MockMvcRequestBuilders.get(“xxx”)

    构造一个请求,返回类型:MockHttpServletRequestBuilder

  4. 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值