Spring Mvc controller单元测试

来源:互联网 发布:js中的element 编辑:程序博客网 时间:2024/06/06 00:19

 弄了一下午的controller测试类,(主要还是不理解)~~~~~

现在把我测试通过的步骤保存下来,为需要的人一份借鉴

SpringMVC controller测试较简单,从功能角度划分,可分为两种。一种是调用请求路径测试,另一种是直接调用Controller方法测试。(我这是属于前者)


注解:

  • RunWith(SpringJUnit4ClassRunner.class): 表示使用Spring Test组件进行单元测试;
  • WebAppConfiguration: 使用这个Annotate会在跑单元测试的时候真实的启一个web服务,然后开始调用Controller的Rest API,待单元测试跑完之后再将web服务停掉;
  • ContextConfiguration: 指定Bean的配置文件信息,可以有多种方式,这个例子使用的是文件路径形式,如果有多个配置文件,可以将括号中的信息配置为一个字符串数组来表示;


1、首先开发一个基类,用于载入配置文件。以下所有的测试实现类都要继承这个类

package com.xx.xx.common;import org.junit.runner.RunWith;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.transaction.annotation.Transactional;/** * Created by xx on 2017/11/13. */@RunWith(SpringJUnit4ClassRunner.class)@WebAppConfiguration@ContextConfiguration(locations= {"classpath:spring-mvc.xml","classpath:spring-context.xml"})@TransactionConfiguration(defaultRollback = true)@Transactional(rollbackFor = Exception.class)public class TestBase {} 

2、接下来的测试的类TbsysUserControllerTest一定要继承上面的基类

package com.xx.xx.controller;import com.xx.xx.api.TbsysUserController;import com.xx.xx.common.TestBase;import org.junit.After;import org.junit.Before;import org.junit.Test;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.test.web.servlet.MockMvc;import org.springframework.test.web.servlet.MvcResult;import org.springframework.test.web.servlet.ResultActions;import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;import org.springframework.test.web.servlet.setup.MockMvcBuilders;/** * Created by xieyuzhi on 2017/11/30. */public class TbsysUsercControllerTest  extends TestBase {    @Autowired     TbsysUserController tbsysUserController;    /**     * MockMvc是SpringMVC提供的Controller测试类,每次进行单元测试时,都是预先执行@Before中的setup方法,初始tbsysUserController单元测试环境。     MockMvc实现了对Http请求的模拟,能够直接使用网络的形式,转换到Controller的调用,     这样可以使得测试速度快、不依赖网络环境,而且提供了一套验证的工具,这样可以使得请求的验证统一而且很方便。 ​ */         MockMvc mockMvc;    @Before    public void setup(){        /*** 注意:一定要把待测试的Controller实例进行*/        mockMvc= MockMvcBuilders.standaloneSetup(tbsysUserController).build();    }    @After    public void after() throws Exception {    }    //调用请求路径    @Test    public void Ctest() throws Exception{         //第一种方法       ResultActions resultActions = this.mockMvc.perform(MockMvcRequestBuilders.post("/user/getdata").param("username", "xyz").param("pwd", "eHl6"));        MvcResult mvcResult = resultActions.andReturn();        //获取状态码        System.out.println(mvcResult.getResponse().getStatus());        String result = mvcResult.getResponse().getContentAsString();        System.out.println("=====后台代码返回的数据:" + result);        //第二种方法//        mockMvc.perform((post("/user/getdata")//                .param("username", "xyz").param("pwd", "eHl6")))//                .andExpect(status().isOk())//                .andDo(print());    }}

3、展示一下我的被测试的controller



注意,如果这样复制到你的代码里面运行会报错:

1、解决错误: Failed to load class "org.slf4j.impl.StaticLoggerBinder"

    将下面的放到了我的pom.xml里面了(解决heribnate的保存日志和java本身自带的报日志的不兼容问题)

  1. <dependency>  
  2.       <groupId>org.slf4j</groupId>  
  3.       <artifactId>slf4j-log4j12</artifactId>  
  4.       <version>1.7.5</version>  
  5.       <scope>provided</scope>  
  6.     </dependency>  
  7.     <dependency>  
  8.       <groupId>log4j</groupId>  
  9.       <artifactId>log4j</artifactId>  
  10.       <version>1.2.14</version>  
  11.       <scope>provided</scope>  
  12.     </dependency> 

我采用的是Spring Mvc 所以上面的两个jar包都采用pom.xml的形式进行添加


2、可能会报错为空指针的问题

java.lang.NullPointerException 空指针异常问题

我的按照这个走的就是总是报错tbsysUserController为null;

在网上搜了好多网页,废了好长时间,发现是我的映射路径错了;

1、可能是选择的是post方法,结果在controller的@RequestMapping里面讲获取的方式写成了get,我就把它两种方式都写上了,看截图标的3的地方

2、我截的图画了三个框,1和2代表类和方法的映射路径,这个必须要写,我一开始只写了方法的路径/getdata,结果还是报空指针的错,然后我就把类的映射路径也加上了

总结:网上关于这类的博客有很多,就是在一些小细节方面可能自己刚入门还不是很懂,所以就理解的不是很到位,很多东西需要自己多撞撞墙就知道了,相信有很多和我一样的人




    借鉴链接:http://blog.csdn.net/u013041642/article/details/71430293




    原创粉丝点击