zoukankan      html  css  js  c++  java
  • SpringMVC单元测试之MockMVC,模拟登入用户

    今天介绍一下springMVC的单元测试,可以参考spring官方文档进行
    前提准备,springmvc的demo工程,这里就不做叙述了
    pom.xml
    [html] view plain copy 在CODE上查看代码片派生到我的代码片
     <dependency>  
    <groupId>org.springframework</groupId>  
    <artifactId>spring-core</artifactId>  
     </dependency>  
     <dependency>  
       <groupId>org.springframework</groupId>  
       <artifactId>spring-beans</artifactId>  
     </dependency>  
     <dependency>  
    <groupId>org.springframework</groupId>  
    <artifactId>spring-context</artifactId>  
     </dependency>  
     <dependency>  
       <groupId>org.springframework</groupId>  
       <artifactId>spring-context-support</artifactId>  
     </dependency>  
     <dependency>  
       <groupId>org.springframework</groupId>  
       <artifactId>spring-web</artifactId>  
     </dependency>  
     <dependency>  
       <groupId>org.springframework</groupId>  
       <artifactId>spring-webmvc</artifactId>  
     </dependency>  
     <dependency>  
       <groupId>org.springframework</groupId>  
       <artifactId>spring-orm</artifactId>  
     </dependency>  
     <dependency>  
       <groupId>org.springframework</groupId>  
       <artifactId>spring-tx</artifactId>  
     </dependency>  
     <dependency>  
       <groupId>org.springframework</groupId>  
       <artifactId>spring-test</artifactId>  
     </dependency>  
     <dependency>  
       <groupId>junit</groupId>  
       <artifactId>junit</artifactId>  
     </dependency>  
    
    controller层
    [java] view plain copy 在CODE上查看代码片派生到我的代码片
    package controller;  
      
    import javax.servlet.http.HttpSession;  
      
    import org.springframework.beans.factory.annotation.Autowired;  
    import org.springframework.web.bind.annotation.PathVariable;  
    import org.springframework.web.bind.annotation.RequestMapping;  
    import org.springframework.web.bind.annotation.RequestMethod;  
    import org.springframework.web.bind.annotation.RequestParam;  
    import org.springframework.web.bind.annotation.RestController;  
      
    import service.UserService;  
    import domain.User;  
      
    /** 
     * UserController. 
     * @author Leon Lee 
     */  
    @RestController  
    @RequestMapping(value = "user")  
    public class UserController {  
      
        /** 
         * UserService interface. 
         */  
        @Autowired  
        private UserService userService;  
      
        /** 
         * Get user MSG. 
         * @param userId 
         * @return user Msg 
         */  
        @RequestMapping(value = "userMsg/{userId}", method = RequestMethod.GET)  
        public User getUserMsg(@PathVariable(value = "userId") String userId) {  
            return userService.getUserMsg(userId);  
        }  
          
        /** 
         * Update user MSG. 
         * @param userId 
         * @param userName 
         * @return updated user MSG 
         */  
        @RequestMapping(value = "userMsg/{userId}", method = RequestMethod.PUT)  
        public User putUserMsg(@PathVariable(value = "userId") String userId, @RequestParam String userName,HttpSession session){  
            if(null == (String)session.getAttribute("loginUser"))  
                return new User();  
            System.out.println((String)session.getAttribute("loginUser"));  
            return userService.putUserMsg(userId, userName);  
        }  
          
        /** 
         * Delete user. 
         * @param userId 
         * @return deleted user MSG 
         */  
        @RequestMapping(value = "userMsg/{userId}", method = RequestMethod.DELETE)  
        public User delUserMsg(@PathVariable(value = "userId") String userId){  
            return userService.delUserMsg(userId);  
        }  
          
        /** 
         * Add user. 
         * @param userName 
         * @return added user MSG 
         */  
        @RequestMapping(value = "userMsg", method = RequestMethod.POST)  
        public User postUserMsg(@RequestParam String userName){  
            return userService.postUserMsg(userName);  
        }  
          
        /** 
         * login User. Note that do not send password as url. 
         * @param userId 
         * @param password 
         * @return 
         */  
        @RequestMapping(value = "userMsg/{userId}/{password}", method = RequestMethod.GET)  
        public boolean loginUser(@PathVariable String userId, @PathVariable String password, HttpSession session){  
            if("loginUser".equals(userId)&&"loginUser".equals(password)){  
                session.setAttribute("loginUser", userId);  
                return true;  
            }  
            return false;  
        }  
    }  
    
    
    单元测试类
    这里的静态导入比较重要,有时候没办法自动导入的
    就是下面的 import static xxx.*
    
    另一点,
    [java] view plain copy 在CODE上查看代码片派生到我的代码片
    @ContextConfiguration(locations = {"classpath:applicationContext.xml","classpath:applicationContext.mvc.xml"})  
    代表的是加载的配置文件,可以根据需要进行添加
    
    [java] view plain copy 在CODE上查看代码片派生到我的代码片
    package controller.test;  
      
    import static org.springframework.test.web.servlet.setup.MockMvcBuilders.*;  
    import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;  
    import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.*;  
    import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;  
      
    import javax.servlet.http.HttpSession;  
      
    import org.junit.Before;  
    import org.junit.Test;  
    import org.junit.runner.RunWith;  
    import org.springframework.beans.factory.annotation.Autowired;  
    import org.springframework.http.MediaType;  
    import org.springframework.mock.web.MockHttpSession;  
    import org.springframework.test.annotation.Rollback;  
    import org.springframework.test.context.ContextConfiguration;  
    import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;  
    import org.springframework.test.context.transaction.TransactionConfiguration;  
    import org.springframework.test.context.web.WebAppConfiguration;  
    import org.springframework.test.web.servlet.MockMvc;  
    import org.springframework.test.web.servlet.MvcResult;  
    import org.springframework.transaction.annotation.Transactional;  
    import org.springframework.web.context.WebApplicationContext;  
      
    /** 
     * spring mvc Test. 
     * @author Leon Lee 
     * @since spring-4.1.7 
     */  
    // spring 4.3 change to SpringRunner.class  
    @RunWith(SpringJUnit4ClassRunner.class)  
    @WebAppConfiguration  
    @ContextConfiguration(locations = {"classpath:applicationContext.xml","classpath:applicationContext.mvc.xml"})  
    // do rollback  
    @TransactionConfiguration(defaultRollback = true)  
    @Transactional  
    public class TestTemplate {  
        @Autowired  
        private WebApplicationContext wac;  
          
        private MockMvc mockMvc;  
        private MockHttpSession session;  
      
        @Before  
        public void setup() {  
            // init applicationContext  
            this.mockMvc = webAppContextSetup(this.wac).build();  
            this.session = new MockHttpSession();  
        }  
      
        @Test  
        public void getUserMsg() throws Exception {  
            // get using get  
            this.mockMvc  
                    .perform((get("/user/userMsg/003"))  
                            .accept(MediaType.parseMediaType("application/json;charset=UTF-8")))  
                    .andExpect(status().isOk())  
                    .andExpect(content().contentType("application/json;charset=UTF-8"))  
                    .andDo(print()); // print  
        }  
      
        @Test  
        // don't rollback  
        @Rollback(false)  
        public void putUserMsg() throws Exception {  
            // update using put  
            this.mockMvc  
                    .perform((put("/user/userMsg/003"))  
                            .contentType(MediaType.APPLICATION_FORM_URLENCODED)  
                            .param("userName","新名字03号")  
                            .session((MockHttpSession)getLoginSession())  
                            .accept(MediaType.parseMediaType("application/json;charset=UTF-8"))  
                            )  
                    .andExpect(status().isOk())  
                    .andExpect(content().contentType("application/json;charset=UTF-8"))  
                    .andDo(print()); // print  
        }  
      
        @Test  
        public void delUser() throws Exception {  
            // delete using delete  
            this.mockMvc  
                    .perform((delete("/user/userMsg/004"))  
                            .accept(MediaType.parseMediaType("application/json;charset=UTF-8"))  
                            )  
                    .andExpect(status().isOk())  
                    .andExpect(content().contentType("application/json;charset=UTF-8"))  
                    .andDo(print()); //print  
        }  
          
        @Test  
        // don't rollback  
        @Rollback(false)  
        public void postUser() throws Exception{  
            // add using post  
            this.mockMvc  
                    .perform((post("/user/userMsg"))  
                            .param("userName", "最新的用户")  
                            .accept(MediaType.parseMediaType("application/json;charset=UTF-8"))  
                            )  
                    .andExpect(status().isOk())  
                    .andExpect(content().contentType("application/json;charset=UTF-8"))  
                    .andDo(print()); //print  
        }  
          
        /** 
         * 获取登入信息session 
         * @return 
         * @throws Exception 
         */  
        private HttpSession getLoginSession() throws Exception{  
            // mock request get login session  
            // url = /xxx/xxx/{username}/{password}  
            MvcResult result = this.mockMvc  
                                    .perform((get("/user/userMsg/loginUser/loginUser")))  
                                    .andExpect(status().isOk())  
                                    .andReturn();  
            return result.getRequest().getSession();  
        }  
    } 
  • 相关阅读:
    数据结构选讲深入理解红黑树(Red Black Tree)
    [CLRS][CH 15.2] 动态规划之矩阵链乘法
    数据结构选讲树的旋转(Rotation)
    数据结构选讲二叉查找树(Binary Search Tree)
    [SICP][CH 2.2] 层次性数据和闭包性质
    [CLRS][CH 15.3] 动态规划基础
    数据结构选讲234树(234 Tree)
    IEnumerable与IEnumerator
    你日常所做的事情,决定你将永远成为什么样的人
    c#中正则表达中特殊字符的转义!
  • 原文地址:https://www.cnblogs.com/xiadongqing/p/6211429.html
Copyright © 2011-2022 走看看