ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

springboot Mock测试模块

2020-05-21 12:51:24  阅读:331  来源: 互联网

标签:springboot perform MockMvcRequestBuilders andExpect 模块 employee mockMvc Mock Moc


springboot Mock测试模块

目录

如果测试方法较多, 推荐使用静态导包

#方法一:

可用全局的controller

    private MockMvc mockMvc;
    @BeforeEach
    public void setup(WebApplicationContext wac) {
        this.mockMvc = MockMvcBuilders.webAppContextSetup(wac).build();
    }

#方法二:

细粒度更高的, 指定测试controller

这里要注意的是 一定要注入controller

    private MockMvc mockMvc;
    //controller中调用了Service, 必须要注入controller,否则会出现空指针
    @Autowired
    private EmployeeController employeeController;
    @BeforeEach
    public void setup() {
        //设置全局
        mockMvc = MockMvcBuilders.standaloneSetup(
                employeeController)
                .alwaysExpect(MockMvcResultMatchers.status().isOk())
                .alwaysDo(MockMvcResultHandlers.print())
                .build();
    }
#方法三:
//默认使用80端口,需要修改为RANDOM_PORT否则会报空指针
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@AutoConfigureMockMvc
public class MockTest3 {
    @Autowired
    MockMvc mockMvc;

    @Test
    public void get() throws Exception {
        mockMvc.perform(MockMvcRequestBuilders.post("/employee/get").param("name", "Black"))
                .andExpect(MockMvcResultMatchers.status().isOk())
                .andDo(MockMvcResultHandlers.print());
    }
}
#注意点:

如果前端发送的请求头的Content-Type 不是 默认的请求头要在测试的request中指明 如:

  • 模拟接收json:
		ObjectMapper mapper = new ObjectMapper();
        Employee employee = new Employee();
        employee.setLastName("战五渣").setAge(23).setGender("2").setEmail("333");
        String value = mapper.writeValueAsString(employee);
        mockMvc.perform( MockMvcRequestBuilders
                .post("/employee/save")
                //如果接收的Json数据要指定contentType
                .content(value.getBytes()).contentType(MediaType.APPLICATION_JSON));
  

可以在测试方法上加上@Transactional 默认rollback = true , 即使方法执行成功也会回滚,

这样数据库中的数据就不会被污染了

  • 模拟文件上传:
  mockMvc.perform(MockMvcRequestBuilders.
                multipart("/employee/upload")
                .file("file", "文件内容".getBytes())
                .contentType(MediaType.MULTIPART_FORM_DATA))
                .andExpect(MockMvcResultMatchers.status().isOk())
                .andDo(MockMvcResultHandlers.print());
  • 模拟事务:
	@Test
    @Rollback//可以加上@Rollback以清楚显示事务回滚, 默认true
    @Transactional
    public void test() throws Exception {
        MultiValueMap<String, String> map = new LinkedMultiValueMap<>();
        map.add("formId", "2");
        map.add("toId", "3");
        map.add("age", "10");
        mockMvc.perform(MockMvcRequestBuilders
                .get("/employee/tran")
                .params(map));
    }
  • 检查返回的json值
 mockMvc.perform(MockMvcRequestBuilders
                .post("/employee/get?name={name}","Black"))
                //指定返回的json值, 这里的$表示json的根节点
                .andExpect(MockMvcResultMatchers.jsonPath("$.lastName")
                        .value("Black"));
  • 检查返回的视图层
mockMvc.perform(MockMvcRequestBuilders
                .get("/employee/test"))
                .andExpect(MockMvcResultMatchers
                        //检查返回的视图层, 这里的viewName不能与请求的uri相同否则会抛出异常
                        .view().name("view"));

重定向 请求转发

     mockMvc.perform(MockMvcRequestBuilders
                .get("/employee/test"))
                .andExpect(MockMvcResultMatchers
//                        请求转发语重定向
//                       .forwardedUrl("/index.html")
                        .redirectedUrl("/view.html"));
  • 检查model
        mockMvc.perform(MockMvcRequestBuilders
                .get("/employee/model"))
                .andExpect(MockMvcResultMatchers.model().size(1))
                .andExpect(MockMvcResultMatchers.model().attributeExists("key"))
                .andExpect(MockMvcResultMatchers.model().attribute("key","value"));

标签:springboot,perform,MockMvcRequestBuilders,andExpect,模块,employee,mockMvc,Mock,Moc
来源: https://www.cnblogs.com/kikochz/p/12930016.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有