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

调用请求路径测试

通过请求路径调用,请求需要经过拦截器,再到对应的Controller方法处理

被测试代码示例

import com.agoura.agoura.entity.Members;
import com.agoura.agoura.service.MembersService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletRequest; @Controller
@RequestMapping("/api")
public class MembersController { @Autowired
private MembersService membersService; @RequestMapping(value = "/user", method = RequestMethod.POST, produces = "application/json;charset=UTF-8")
@ResponseBody
public String getUser(HttpServletRequest request, @RequestBody String str,
@RequestParam(value = "userId") String userId) {
Members result = membersService.getMemberById(Integer.valueOf(userId));
return result.toString();
}
}

测试代码示例

import com.agoura.agoura.entity.Members;
import com.agoura.agoura.service.MembersService;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.MvcResult;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext; import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.when;
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.model;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @RunWith(SpringJUnit4ClassRunner.class) //调用Spring单元测试类
@WebAppConfiguration //调用Java Web组件,如自动注入ServletContext Bean等
@ContextConfiguration(locations = {"classpath*:spring-*.xml"}) //加载Spring配置文件
public class MembersControllerTest2 { @Autowired
protected WebApplicationContext wac; @Mock
private MembersService service; @InjectMocks
private MembersController controller; //需要测试的Controller private MockMvc mockMvc; //SpringMVC提供的Controller测试类 private String url; @Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
mockMvc = MockMvcBuilders.standaloneSetup(wac).build();
} @Test
public void testGetUser() throws Exception {
url = "the URL to Controller"; Members m = new Members(3, "wangwu", 1, 5, "12131232342");
when(service.getMemberById(Mockito.anyInt())).thenReturn(m); MvcResult result = mockMvc
.perform(MockMvcRequestBuilders.post(url)
.accept(MediaType.APPLICATION_JSON)
.param("userId", "3"))
.andDo(print())
.andExpect(status().isOk())
.andExpect(model().attributeExists("name"))
.andReturn();
assertEquals(m.toString(), result.getModelAndView().getModel().get("user").toString());
}
}

调用Controller方法测试

无法对拦截器和URL路径配置进行测试。测试方法类似于service层单元测试,可以对依赖的service层进行mock。可以参考spring service层单元测试一文

被测试代码示例

测试代码同调用请求路径测试方式部分一样

测试代码示例

import com.agoura.agoura.entity.Members;
import com.agoura.agoura.service.MembersService;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import org.springframework.mock.web.MockHttpServletRequest;
import org.springframework.mock.web.MockHttpSession;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import org.springframework.test.web.servlet.setup.MockMvcBuilders; import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.when; @RunWith(SpringJUnit4ClassRunner.class) //调用Spring单元测试类
@WebAppConfiguration //调用Java Web组件,如自动注入ServletContext Bean等
@ContextConfiguration(locations = {"classpath*:spring-*.xml"}) //加载Spring配置文件
public class MembersControllerTest {
@Mock
private MembersService service; @InjectMocks
private MembersController controller; //需要测试的Controller
private MockHttpServletRequest request; private MockMvc mockMvc; //SpringMVC提供的Controller测试类 @Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
request = new MockHttpServletRequest();
} @Test
public void testGetUser() throws Exception {
request.addParameter("userId", "100100"); // request.addParameter("id", "101010"); //如果需要从request取数据,可以在request中添加parameter Members m = new Members(3, "wangwu", 1, 5, "12131232342");
when(service.getMemberById(Mockito.anyInt())).thenReturn(m); String response = new String();
String result = controller.getUser(request, response, "3");
assertEquals(m.toString(), result);
}
}

Spring Controller单元测试的更多相关文章

  1. Spring MVC Controller 单元测试

    简介 Controller层的单元测试可以使得应用的可靠性得到提升,虽然这使得开发的时间有所增加,有得必失,这里我认为得到的比失去的多很多. Sping MVC3.2版本之后的单元测试方法有所变化,随 ...

  2. Spring Boot单元测试(Mock)

    Spring Boot单元测试(Mock) Java个人学习心得 2017-08-12 16:07 Mock 单元测试的重要性就不多说了,我这边的工程一般都是Spring Boot+Mybatis(详 ...

  3. Spring MVC学习总结(1)——Spring MVC单元测试

    关于spring MVC单元测试常规的方法则是启动WEB服务器,测试出错 ,停掉WEB 改代码,重启WEB,测试,大量的时间都浪费在WEB服务器的启动上,下面介绍个实用的方法,spring MVC单元 ...

  4. Spring MVC -- 单元测试和集成测试

    测试在软件开发中的重要性不言而喻.测试的主要目的是尽早发现错误,最好是在代码开发的同时.逻辑上认为,错误发现的越早,修复的成本越低.如果在编程中发现错误,可以立即更改代码:如果软件发布后,客户发现错误 ...

  5. Spring Boot 单元测试示例

    Spring 框架提供了一个专门的测试模块(spring-test),用于应用程序的单元测试. 在 Spring Boot 中,你可以通过spring-boot-starter-test启动器快速开启 ...

  6. Spring之单元测试

    引言 是否在程序运行时使用单元测试是衡量一个程序员素质的一个重要指标.使用单元测试既可以让我检查程序逻辑的正确性还可以让我们减少程序测试的BUG,便于调试可以提高我们写程序的效率.以前我们做单元测试的 ...

  7. jQuery 传递对象参数到Spring Controller

    当jQuery 发送ajax请求需要传递多个参数时,如果参数过多,Controller接收参数时就需要定义多个参数,这样接口方法会比较长,也不方便.Spring可以传递对象参数,将你需要的所有查询条件 ...

  8. postman传递对象到spring controller的方式

    1.spring Controller @RestController @RequestMapping(value = "/basic/task") public class Ta ...

  9. spring controller 获取context

    想要获取context需要先熟悉spring是怎么在web容器中启动的,spring启动过程其实就是其IOC容器的启动过程,对于web程序,IOC容器启动过程即是建立上下文的过程 spring启动过程 ...

随机推荐

  1. 数字图像处理(MATLAB版)学习笔记(1)——第1章 绪言

    0.下定决心 当当入手数字图像处理一本,从此开此正式跨入数字图像处理大门.以前虽然多多少少接触过这些东西,也做过一些相关的事情,但感觉都不够系统,也不够专业,从今天开始,一步一步地学习下去,相信会有成 ...

  2. python 线程与进程

    线程和进程简介 应用程序和进程以及线程的关系? 一个应用程序里可以有多个进程,一个进程里可以有多个线程 最原始的计算机是如何运行的? CPU是什么?为什么要使用多个CPU? 为什么要使用多线程? 为什 ...

  3. C++迭代器 iterator【转】

    1. 迭代器(iterator)是一中检查容器内元素并遍历元素的数据类型.(1) 每种容器类型都定义了自己的迭代器类型,如vector:vector<int>::iterator iter ...

  4. Java 基础知识总结 2

    11.Java常用类: StringBuffer StringBuffer 是使用缓冲区的,本身也是操作字符串的,但是与String类不同,String类的内容一旦声明之后则不可以改变,改变的只是其内 ...

  5. Spring Boot 学习笔记--整合Redis

    1.新建Spring Boot项目 添加spring-boot-starter-data-redis依赖 <dependency> <groupId>org.springfra ...

  6. Xcode新建python项目

    1.找到电脑上安装Python的路径.OSX系统默认安装了python,默认的路径为/usr/bin/python.不确定的情况下,也可以打开命令行,用 whereis python 命令查看 2.打 ...

  7. 浅谈 虚方法(virtual)

    虚方法 理解:从字面意思来讲,"虚",可有可无,子类对父类的某种方法的重写,可以重写,也可以不重写. 虚方法,顾名思义(装个13),就是某种方法. 用法:public virtua ...

  8. Jenkins: 使用groovy + job-dsl 创建并触发job

    Jenkins: 使用groovy + job-dsl 创建并触发job 背景: 我们的 Automation 测试脚本需要在10个不同语言的机器上跑,本地化测试产品. 我们用Jenkins启动测试执 ...

  9. SELECT中的多表连接

    MySQL多表连接查询 连接(join):将一张表中的行按照某个条件(连接条件)和另一张表中的行连接起来形成一个新行的过程. 根据连接查询返回的结果,分3类: 内连接(inner join) 外连接( ...

  10. "fatal: protocol error: bad line length character: No This"

    git clone 远程地址时候出现 "fatal: protocol error: bad line length character: No This" 错误 在stackov ...