使用MockMvc进行controller层单元测试 事务自动回滚的完整案例

看代码吧~

package com.ieou.ms_backend.controller;
import com.google.gson.Gson;
import com.ieou.ms_backend.dto.account.CreateAccountReq;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.http.MediaType;
import org.springframework.test.annotation.Rollback;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.MockMvcBuilder;
import org.springframework.test.web.servlet.ResultActions;
import org.springframework.test.web.servlet.ResultMatcher;
import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.result.MockMvcResultHandlers;
import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.context.WebApplicationContext;
import static org.junit.Assert.*;
/**
 * created by wyz on 2019/5/6
 */
@SpringBootTest
@RunWith(SpringJUnit4ClassRunner.class)
public class AccountControllerTest {
    @Autowired
    private WebApplicationContext wac;
    private MockMvc mockMvc;
    private String url = "/ms_backend/account/";
    @Before
    public void setUp() throws Exception{
        //初始化MockMvc对象
        mockMvc = MockMvcBuilders.webAppContextSetup(wac).build();
    }
    //GET 请求
    @Test
    public void accountList() throws Exception {
        MockHttpServletRequestBuilder mockHttpServletRequestBuilder = MockMvcRequestBuilders.get(url + "accountList")
                .param("companyName", "wang")
                .header("access_token", "accessToken");
        mockHttpServletRequestBuilder.accept(MediaType.APPLICATION_JSON)
                .contentType(MediaType.APPLICATION_JSON_UTF8);
        ResultActions resultActions = mockMvc.perform(mockHttpServletRequestBuilder);
        resultActions.andReturn().getResponse().setCharacterEncoding("UTF-8");
        resultActions.andExpect(MockMvcResultMatchers.status().isOk());
        resultActions.andDo(MockMvcResultHandlers.print());
    }
    @Test
    public void removeAccount() {
    }
    //post 请求  @RequestBody
    @Test
    @Transactional
    @Rollback() // 事务自动回滚,默认是true。可以不写
    public void createAccount() throws Exception {
        CreateAccountReq req = new CreateAccountReq();
        MockHttpServletRequestBuilder mockHttpServletRequestBuilder = MockMvcRequestBuilders.post(url + "createAccount")
                .header("access_token", "accessToken");
        mockHttpServletRequestBuilder.accept(MediaType.APPLICATION_JSON)
                .contentType(MediaType.APPLICATION_JSON_UTF8)
                .content(new Gson().toJson(req)); // post请求
        ResultActions resultActions = mockMvc.perform(mockHttpServletRequestBuilder);
        resultActions.andReturn().getResponse().setCharacterEncoding("UTF-8");
        resultActions.andExpect(MockMvcResultMatchers.status().isOk());
        resultActions.andDo(MockMvcResultHandlers.print());
    }
}

Spring-test 单元测试数据不自动回滚的解决方案

在使用JUnit做单元测试时,为了使测试数据不对数据库造成污染,故选取了spring-test进行单元测试,但在进行dao层的测试时,发现save方法无法进行数据的自动回滚。

逐一进行检查分析,事务也开启了,并使用注解方式标记@RollBack(true),在控制台中也打出了事务回滚的信息,但仍然不能自动回滚。

后来感觉是数据库的原因,我的数据库使用的是MySql,这就存在数据表的类型是否支持事务情况。

逐查阅MySql相关文档,发现,InnoDB类型的表是支持事务的,而MyISAM是不支持事务的,立刻查看数据表类型,果然为MyISAM,改为InnoDB后,重新进行测试,问题得到解决。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

时间: 2021-06-09

SpringBoot MockMvc单元测试的示例代码

为何使用MockMvc? 对模块进行集成测试时,希望能够通过输入URL对Controller进行测试,如果通过启动服务器,建立http client进行测试,这样会使得测试变得很麻烦,比如,启动速度慢,测试验证不方便,依赖网络环境等,所以为了可以对Controller进行测试,我们引入了MockMVC. MockMvc实现了对Http请求的模拟,能够直接使用网络的形式,转换到Controller的调用,这样可以使得测试速度快.不依赖网络环境,而且提供了一套验证的工具,这样可以使得请求的验证统一而

详解Spring MVC如何测试Controller(使用springmvc mock测试)

在springmvc中一般的测试用例都是测试service层,今天我来演示下如何使用springmvc mock直接测试controller层代码. 1.什么是mock测试? mock测试就是在测试过程中,对于某些不容易构造或者不容易获取的对象,用一个虚拟的对象来创建以便测试的测试方法. 2.为什么要使用mock测试? 使用Mock O bject进行测试,主要是用来模拟那些在应用中不容易构造(如HttpServletRequest必须在Servlet容器中才能构造出来)或者比较复杂的对象(如J

Spring Boot从Controller层进行单元测试的实现

单元测试是程序员对代码的自测,一般公司都会严格要求单元测试,这是对自己代码的负责,也是对代码的敬畏. 一般单元测试都是测试Service层,下面我将演示从Controller层进行单元测试. 无参Controller单元测试示例: package com.pingan.bloan.genesis.controller.base; import org.junit.After; import org.junit.Before; import org.junit.runner.RunWith; im

spring-mvc/springboot使用MockMvc对controller进行测试

网上基本都是参考官方的使用方式,使用了import static,个人感觉这种方式特别不好,代码提示性不友好.所以在此进行说明,也方便自己以后使用. 1. 引入spring-test相关jar包,springboot只需引入spring-boot-starter-test即可 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tes

深入理解Spring MVC概要与环境配置

一.MVC概要 MVC是模型(Model).视图(View).控制器(Controller)的简写,是一种软件设计规范,用一种将业务逻辑.数据.显示分离的方法组织代码,MVC主要作用是降低了视图与业务逻辑间的双向偶合.MVC不是一种设计模式,MVC是一种架构模式.当然不同的MVC存在差异. 在web早期的开发中,通常采用的都是Model1.Model1中,如图所示主要分为两层,视图层和模型层.Model2把一个项目分成三部分,包括视图.控制.模型.这样不仅提高的代码的复用率与项目的扩展性,且大大

14个编写Spring MVC控制器的实用小技巧(吐血整理)

本文介绍了编写Spring MVC框架的控制器(controller)的基础技巧和最佳操作.在Spring MVC框架中,编写控制器类通常是为了处理用户提出的请求. 编写完成后,控制器会调用一个业务类来处理业务相关任务,进而重定向客户到逻辑视图名.Springdispatcher servlet会对逻辑视图名进行解析,并渲染结果或输出.这就是一个典型的"请求-响应"的完整流程. 1.使用@controllerstereotype 创建一个能够处理单个或多个请求的控制器类,最简单的方法就

Java Spring MVC 上传下载文件配置及controller方法详解

下载: 1.在spring-mvc中配置(用于100M以下的文件下载) <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> <property name="messageConverters"> <list> <!--配置下载返回类型--> <bean class="or

Spring MVC学习笔记之Controller查找(基于Spring4.0.3)

0 摘要 本文从源码层面简单讲解SpringMVC的处理器映射环节,也就是查找Controller详细过程 1 SpringMVC请求流程 Controller查找在上图中对应的步骤1至2的过程 SpringMVC详细运行流程图 2 SpringMVC初始化过程 2.1 先认识两个类 1.RequestMappingInfo 封装RequestMapping注解 包含HTTP请求头的相关信息 一个实例对应一个RequestMapping注解 2.HandlerMethod 封装Controlle

在spring-boot工程中添加spring mvc拦截器

1. 认识拦截器 Spring MVC的拦截器(Interceptor)不是Filter,同样可以实现请求的预处理.后处理.使用拦截器仅需要两个步骤: 实现拦截器 注册拦截器 1.1 实现拦截器 实现拦截器可以自定义实现HandlerInterceptor接口,也可以通过继承HandlerInterceptorAdapter类,后者是前者的实现类.下面是拦截器的一个实现的例子,目的是判断用户是否登录.如果preHandle方法return true,则继续后续处理. public class L

Spring mvc Controller和RestFul原理解析

控制器Controller 控制器复杂提供访问应用程序的行为,通常通过接口定义或注解定义两种方法实现. 控制器负责解析用户的请求并将其转换为一个模型. 在Spring MVC中一个控制器类可以包含多个方法 在Spring MVC中,对于Controller的配置方式有很多种 实现Controller接口 Controller是一个接口,在org.springframework.web.servlet.mvc包下,接口中只有一个方法: //实现该接口的类获得控制器功能 public interfa

Spring MVC全局异常实例详解

目录 无SpringMVC全局异常时的流程图 SpringMVC全局异常流程图 其实是一个ModelAndView对象 配置文件 applicationcontext.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.

如何测试Spring MVC应用

Spring的依赖注入使得我们的代码非常容易进行单元测试--@Controller, @Service,@Entity等注解标注的类基本都是POJO(plain old Java object),也就是说很少依赖于Spring容器本身的API.我们可以非常容易地使用JUnit或TestNG编写测试代码.另一方面,对于三层架构的Spring Web应用(Controller, Service, DAO),使用Mock活Stub方法也能够更好的来测试我们的代码逻辑.例如Service层代码的单元测试