Spring Mvc controller单元测试



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




    • 0
      点赞
    • 7
      收藏
      觉得还不错? 一键收藏
    • 1
      评论
    Spring MVC是一种基于MVC(Model-View-Controller)设计模式的Web框架,它可以帮助我们快速地开发Web应用程序。在Spring MVC中,Controller是控制器的核心组件,它负责接收用户请求并决定如何处理这些请求。 在Spring MVC中,我们可以通过编写Controller类来实现请求的处理。在Controller类中,我们可以定义多个方法,每个方法对应处理一个具体的请求。这些方法通常使用注解来标识它们应该处理哪些请求。 例如,我们可以使用@Controller注解来标识一个类为Controller,并使用@RequestMapping注解来标识一个方法应该处理哪些请求。下面是一个简单的Controller类的示例: ``` @Controller @RequestMapping("/hello") public class HelloController { @RequestMapping("/world") public ModelAndView helloWorld() { String message = "Hello World, Spring MVC!"; return new ModelAndView("hello", "message", message); } } ``` 在上面的示例中,我们使用@Controller注解将HelloController类标识为Controller,并使用@RequestMapping注解将该类处理的请求路径设置为“/hello”。我们还使用@RequestMapping注解将helloWorld方法标识为处理“/hello/world”请求的方法。该方法返回一个包含“Hello World, Spring MVC!”消息的ModelAndView对象。 需要注意的是,Controller类的方法可以返回不同类型的结果。除了ModelAndView之外,还可以返回String、void、HttpEntity、ResponseEntity等类型的结果。这些结果将由Spring MVC框架进行处理,并将相应的内容返回给客户端。 总的来说,Spring MVCController是Web应用程序的核心组件之一,它可以帮助我们快速地开发功能强大、易于维护的Web应用程序。
    评论 1
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

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

    抵扣说明:

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

    余额充值