SpringBoot junit 测试 controller (MockMvc)

SpringBoot junit 测试 controller (MockMvc)

基于 RESTful风格的 Spring MVC的测试,我们可以测试完整的 Spring MVC流程

一 . MockMvcBuilder

MockMvcBuilder 是用来构造MockMvc的构造器,其主要有两个实现 : StandaloneMockMvcBuilder和DefaultMockMvcBuilder,分别对应两种测试方式,即独立安装和集成Web环境测试(此种方式并不会集成真正的web环境,而是通过相应的Mock API进行模拟测试,无须启动服务器)。对于我们来说直接使用静态工厂MockMvcBuilders创建即可.

  • 1. 集成 Web环境方式

MockMvcBuilders.webAppContextSetup(WebApplicationContext context):指定WebApplicationContext,将会从该上下文获取相应的控制器并得到相应的MockMvc;

@RunWith(SpringRunner.class)
@SpringBootTest
public class UserControllerTest  {

    @Autowired
    private WebApplicationContext webApplicationContext;

    private MockMvc mockMvc;

    @Before
    public void setUp() throws Exception {
        mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
    } 
    
}
复制代码
  • 2. 独立测试方式

MockMvcBuilders.standaloneSetup(Object... controllers):通过参数指定一组控制器,这样就不需要从上下文获取了;

@RunWith(SpringRunner.class)
@SpringBootTest
public class UserControllerTest  {

    private MockMvc mockMvc;

    @Before
    public void setUp() throws Exception {
        mockMvc = MockMvcBuilders.standaloneSetup(new UserController()).build();
    } 
}    
复制代码
二 . MockMvc
  • 1.先看一看例子
@RestController
public class UserController {

   /**
    * 创建线程安全的 map
    */
   static Map<Long, User> userMap = Collections.synchronizedMap(new HashMap<>());

   @GetMapping("/users")
   public List<User> getUserList() {
      List<User> list = new ArrayList<>(userMap.values());
      return list;
   }

   @PostMapping("/add")
   public String addUser(@RequestBody User user) {
      userMap.put(user.getId(), user);
      Map<String, String> map = new HashMap<>();
      map.put("status", "200");
      map.put("data", JSON.toJSONString(user));
      return JSON.toJSONString(map);
   }

   @GetMapping("/{id}")
   public User getUserById(@PathVariable("id") Long id) {
      return userMap.get(id);
   }

   @PutMapping("/update")
   public String updateUser(@RequestBody User user) {
      User u = userMap.get(user.getId());
      u.setName(user.getName());
      u.setAge(user.getAge());
      return "success";
   }

   @DeleteMapping("/{id}")
   public String deleteUserById(@PathVariable("id")Long id){
      userMap.remove(id);
      return "success";
   }
}
复制代码
  @RunWith(SpringRunner.class)
  @SpringBootTest
  public class UserControllerTest  {

      @Autowired
      private WebApplicationContext webApplicationContext;

      private MockMvc mockMvc;

      @Before
      public void setUp() throws Exception {
          mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
      } 
      
    /** 
    * 
    * Method: getUserList() 
    * 
    */ 
    @Test
    public void testGetUserList() throws Exception {
        mockMvc.perform(get("/users").accept(MediaType.APPLICATION_JSON_UTF8))
            .andExpect(status().isOk())
            .andDo(print())
            .andExpect(content().string(equalTo("[]")));
    }
      
    /** 
    * 
    * Method: addUser(@RequestBody User user) 
    * 
    */ 
    @Test
    public void testAddUser() throws Exception {
        User user = new User();
        user.setId(1L);
        user.setName("jamie");
        user.setAge(20);
                                        mockMvc.perform(post("/add").contentType(MediaType.APPLICATION_JSON).content(JSON.toJSONString(user)))
            .andExpect(status().isOk())
			.andDo(print())
			.andReturn().getResponse().getContentAsString();

    } 
}      
复制代码

方法解析:

  • perform执行一个RequestBuilder请求,会自动执行SpringMVC的流程并映射到相应的控制器执行处理;
  • get:声明发送一个get请求的方法。MockHttpServletRequestBuilder get(String urlTemplate, Object... urlVariables):根据uri模板和uri变量值得到一个GET请求方式的。另外提供了其他的请求的方法,如:post、put、delete等。
  • andExpect:添加ResultMatcher验证规则,验证控制器执行完成后结果是否正确(对返回的数据进行的判断);
  • andDo:添加ResultHandler结果处理器,比如调试时打印结果到控制台(对返回的数据进行的判断);
  • andReturn:最后返回相应的MvcResult;然后进行自定义验证/进行下一步的异步处理(对返回的数据进行的判断);

整个测试过程非常有规律:

    1. 准备测试环境

    2. 通过MockMvc执行请求

    3. 添加验证断言

    4. 添加结果处理器

    5. 得到MvcResult进行自定义断言/进行下一步的异步请求

    6. 卸载测试环境

参考 [https://www.cnblogs.com/lyy-2016/p/6122144.html]

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值