欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Spring Mvc controller单元测试

程序员文章站 2024-03-15 18:15:06
...


 弄了一下午的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

Spring Mvc 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