美文网首页
如何用代码测试你的SpringBootMVC接口

如何用代码测试你的SpringBootMVC接口

作者: 王大豆 | 来源:发表于2020-08-14 11:38 被阅读0次

    很多时候,我们写完http接口之后,习惯了使用postman做接口测试,但是这样需要一直启动服务器,出错了还要重新启动
    那有什么方式直接使用代码测试接口,而且出错直接停止服务呢。

    首先我们看看maven依赖:

            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
    

    然后我们写一个接口
    GetTestController

    @RestController
    @RequestMapping("/getTest")
    public class GetTestController {
    
        @RequestMapping("/requestTest")
        public String requestTest(){
            return "requestTest";
        }
    }
    

    SpringBoot启动类:
    SpringbootTestApplication

    @SpringBootApplication
    public class SpringbootTestApplication {
        public static void main(String[] args) {
            SpringApplication.run(SpringbootTestApplication.class, args);
        }
    }
    

    接下来就是在项目的测试包下写一个测试类
    先贴一下路径(尽量保证路径和被测试的类一致):


    编写测试类路径.png

    为了快速的生成测试类你可以快捷键(windows alt + enter)点击下图Create Test创建测试类,这样就能快速生成和被测试类包名一样的测试类:


    快速生成测试类.png

    测试类路径:

    @RunWith(SpringRunner.class)
    @WebAppConfiguration
    @SpringBootTest(classes = {SpringbootTestApplication.class})
    public class GetTestControllerTest {
    
        public MockMvc mockMvc;
    
        @Autowired
        private WebApplicationContext context;
    
        @Before
        public void setupMockMvc() {
            mockMvc = MockMvcBuilders.webAppContextSetup(context).build();
        }
    
        @Test
        public void testRequestTest() throws Exception {
            MvcResult mvcResult =
                    mockMvc.perform(get("/getTest/requestTest"))
                    .andExpect(status().isOk()).andDo(MockMvcResultHandlers.print()).andReturn();
            String result = mvcResult.getResponse().getContentAsString();
    
            Assert.assertEquals("requestTest", result);
        }
    
    }
    

    注意,@SpringBootTest(classes = {SpringbootTestApplication.class})后面的classes指定的是上面SpringbootTestApplication启动类
    @Test一定要是import org.junit.Test;

    按照上面的步骤你就能为你写的接口写测试了。

    下面说明一下MockMVC的其他API以及用法

    测试普通接口

    mockMvc.perform(get("/user/{id}", 1)) //执行请求  
                .andExpect(model().attributeExists("user")) //验证存储模型数据  
                .andExpect(view().name("user/view")) //验证viewName  
                .andExpect(forwardedUrl("/WEB-INF/jsp/user/view.jsp"))//验证视图渲染时forward到的jsp  
                .andExpect(status().isOk())//验证状态码  
                .andDo(print()); //输出MvcResult到控制台
    

    得到结果并验证

    MvcResult result = mockMvc.perform(get("/user/{id}", 1))//执行请求  
            .andReturn(); //返回MvcResult  
    Assert.assertNotNull(result.getModelAndView().getModel().get("user")); //自定义断言 
    

    验证请求参数绑定到模型数据及Flash属性

    mockMvc.perform(post("/user").param("name", "zhang")) //执行传递参数的POST请求(也可以post("/user?name=zhang"))  
                .andExpect(handler().handlerType(UserController.class)) //验证执行的控制器类型  
                .andExpect(handler().methodName("create")) //验证执行的控制器方法名  
                .andExpect(model().hasNoErrors()) //验证页面没有错误  
                .andExpect(flash().attributeExists("success")) //验证存在flash属性  
                .andExpect(view().name("redirect:/user")); //验证视图  
    

    文件上传

    byte[] bytes = new byte[] {1, 2};  
    mockMvc.perform(fileUpload("/user/{id}/icon", 1L).file("icon", bytes)) //执行文件上传  
            .andExpect(model().attribute("icon", bytes)) //验证属性相等性  
            .andExpect(view().name("success")); //验证视图 
    

    JSON请求/响应验证

        String requestBody = "{\"id\":1, \"name\":\"zhang\"}";  
        mockMvc.perform(post("/user")  
                .contentType(MediaType.APPLICATION_JSON).content(requestBody)  
                .accept(MediaType.APPLICATION_JSON)) //执行请求  
                .andExpect(content().contentType(MediaType.APPLICATION_JSON)) //验证响应contentType  
                .andExpect(jsonPath("$.id").value(1)); //使用Json path验证JSON 请参考http://goessner.net/articles/JsonPath/  
          
        String errorBody = "{id:1, name:zhang}";  
        MvcResult result = mockMvc.perform(post("/user")  
                .contentType(MediaType.APPLICATION_JSON).content(errorBody)  
                .accept(MediaType.APPLICATION_JSON)) //执行请求  
                .andExpect(status().isBadRequest()) //400错误请求  
                .andReturn();  
          
        Assert.assertTrue(HttpMessageNotReadableException.class.isAssignableFrom(result.getResolvedException().getClass()));//错误的请求内容体
    

    异步测试

    //Callable  
        MvcResult result = mockMvc.perform(get("/user/async1?id=1&name=zhang")) //执行请求  
                .andExpect(request().asyncStarted())  
                .andExpect(request().asyncResult(CoreMatchers.instanceOf(User.class))) //默认会等10秒超时  
                .andReturn();  
          
        mockMvc.perform(asyncDispatch(result))  
                .andExpect(status().isOk())  
                .andExpect(content().contentType(MediaType.APPLICATION_JSON))  
                .andExpect(jsonPath("$.id").value(1));  
    

    全局配置

    mockMvc = webAppContextSetup(wac)  
                .defaultRequest(get("/user/1").requestAttr("default", true)) //默认请求 如果其是Mergeable类型的,会自动合并的哦mockMvc.perform中的RequestBuilder  
                .alwaysDo(print())  //默认每次执行请求后都做的动作  
                .alwaysExpect(request().attribute("default", true)) //默认每次执行后进行验证的断言  
                .build();  
          
        mockMvc.perform(get("/user/1"))  
                .andExpect(model().attributeExists("user"));
    

    相关文章

      网友评论

          本文标题:如何用代码测试你的SpringBootMVC接口

          本文链接:https://www.haomeiwen.com/subject/fuxgdktx.html