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本身自带的报日志的不兼容问题)
- <dependency>
- <groupId>org.slf4j</groupId>
- <artifactId>slf4j-log4j12</artifactId>
- <version>1.7.5</version>
- <scope>provided</scope>
- </dependency>
- <dependency>
- <groupId>log4j</groupId>
- <artifactId>log4j</artifactId>
- <version>1.2.14</version>
- <scope>provided</scope>
-
</dependency>
我采用的是Spring Mvc 所以上面的两个jar包都采用pom.xml的形式进行添加
2、可能会报错为空指针的问题
java.lang.NullPointerException 空指针异常问题
我的按照这个走的就是总是报错tbsysUserController为null;
在网上搜了好多网页,废了好长时间,发现是我的映射路径错了;
1、可能是选择的是post方法,结果在controller的@RequestMapping里面讲获取的方式写成了get,我就把它两种方式都写上了,看截图标的3的地方
2、我截的图画了三个框,1和2代表类和方法的映射路径,这个必须要写,我一开始只写了方法的路径/getdata,结果还是报空指针的错,然后我就把类的映射路径也加上了
总结:网上关于这类的博客有很多,就是在一些小细节方面可能自己刚入门还不是很懂,所以就理解的不是很到位,很多东西需要自己多撞撞墙就知道了,相信有很多和我一样的人
上一篇: sql面试经典50题练习笔记
下一篇: C++类与对象
推荐阅读
-
Spring Mvc controller单元测试
-
Spring MVC静态资源处理 博客分类: Spring springmvcstatic静态mapping
-
spring boot单元测试类的使用.Loading class `com.mysql.jdbc.Driver'. This is deprecated.
-
spring mvc框架增加对消息的加密/解密 博客分类: spring mvc笔记
-
spring mvc框架增加对消息的加密/解密 博客分类: spring mvc笔记
-
Spring MVC返回的json去除根节点名称的方法
-
Java Spring MVC 上传下载文件配置及controller方法详解
-
Spring MVC 中 短信验证码功能的实现方法
-
spring mvc获取header 博客分类: Java springmvcheader
-
Spring MVC 注解自动扫描失效原因分析