单元测试之Mock模拟对Controller进行测试

SpringMVC : Controller层单元测试Mock 代码 @RunWith(SpringJUnit4ClassRunner.class) @WebAppConfiguration @ContextConfiguration(locations = { "classpath:applicationContext.xml", "file:src/main/webapp/WEB-INF/dispatcherServlet-servlet.xml" }... 阅读详情

一、Mock测试介绍

  • 定义
    在单元测试过程中,对于某些不容易构造或者不容易获取的对象,用一个虚拟对象来创建以便测试的方法。

  • 为什么使用mock测试

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

二、使用方式

使用起来很简单,直接上代码

1.controller控制器:

import com.example.demo.web.contract.BaseResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.util.Map;

@Slf4j
@RestController
@RequestMapping("/main")
public class MainController {

    @GetMapping("/get")
    public BaseResponse getReq(@RequestParam Map<String, Object> map) {
        System.err.println(map);
        return new BaseResponse();
    }

    @PostMapping("/post")
    public BaseResponse postReq(@RequestBody Map<String, Object> map) {
        System.err.println(map);
        return new BaseResponse();
    }
    
    //put与delete方法与post同理,这里就不写了
    //…………

    @PostMapping(value = "/file")
    public BaseResponse file(@RequestPart("file") MultipartFile file) {
        System.err.println(file.getOriginalFilename());
        return new BaseResponse();
    }
}

2.测试代码:

import com.alibaba.fastjson.JSON;
import com.example.demo.web.MainController;
import lombok.extern.slf4j.Slf4j;
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.mock.web.MockMultipartFile;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.MvcResult;
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.web.context.WebApplicationContext;

import java.util.HashMap;
import java.util.Map;

@Slf4j
@RunWith(SpringRunner.class)
@SpringBootTest
public class MvcTest {

    MockMvc mockMvc;

    @Autowired
    private WebApplicationContext applicationContext;

    @Autowired
    private MainController mainController;

    @Before
    public void before() {
        mockMvc = MockMvcBuilders.webAppContextSetup(applicationContext).build();

        //通过参数指定一组控制器,这样就不需要从上下文获取了
        //mockMvc = MockMvcBuilders.standaloneSetup(mainController).build();
    }

    /** get **/
    @Test
    public void getTest() throws Exception {

        MockHttpServletRequestBuilder requestBuilder = MockMvcRequestBuilders
                .get("/main/get")
                .accept(MediaType.APPLICATION_JSON)
                .contentType(MediaType.APPLICATION_JSON_UTF8)
                .param("pageNum", "1");

        MvcResult mvcResult = mockMvc.perform(requestBuilder)
                .andDo(MockMvcResultHandlers.print()) //打印输出发出请求的详细信息
                .andExpect(MockMvcResultMatchers.status().isOk()) //对返回值进行断言
                .andReturn();

        System.err.println(mvcResult.getResponse().getContentAsString());
    }

    /** post **/
    @Test
    public void postTest() throws Exception {
        Map<String, Object> map = new HashMap<>();
        map.put("pageNum", 1);

        MockHttpServletRequestBuilder requestBuilder = MockMvcRequestBuilders
                .post("/main/post")
                //.put("/main/put")
                //.delete("/main/delete")
                .accept(MediaType.APPLICATION_JSON)
                .contentType(MediaType.APPLICATION_JSON_UTF8)
                .content(JSON.toJSONString(map));

        MvcResult mvcResult = mockMvc.perform(requestBuilder)
                .andDo(MockMvcResultHandlers.print())
                .andExpect(MockMvcResultMatchers.status().isOk())
                .andReturn();

        System.err.println(mvcResult.getResponse().getContentAsString());
    }

    @Test
    public void fileTest() throws Exception {
        MockHttpServletRequestBuilder requestBuilder = MockMvcRequestBuilders
                .multipart("/main/file")
                .file(new MockMultipartFile("file", "test.txt",
                        "multipart/form-data",
                        "hello upload".getBytes("UTF-8")))
                .accept(MediaType.APPLICATION_JSON)
                .contentType(MediaType.APPLICATION_JSON_UTF8);


        MvcResult mvcResult = mockMvc.perform(requestBuilder)
                .andDo(MockMvcResultHandlers.print())
                .andExpect(MockMvcResultMatchers.status().isOk())
                .andReturn();

        System.err.println(mvcResult.getResponse().getContentAsString());
    }
}
使用mockMVC对controller层进行接口调试 对于controller层的测试,后续可以用Spring Test3.2版本之后提供的mockMVC功能,它支持单模块测试,也支持端到端测试;支持mock,也支持直接调用原始service接口,出了问题也方便我们本地debug断点调试定位问题,和Junit一样无缝集成Spirng框架,所以有时侯用mockMVC会方便很多。但是注意使用mockMVC通过了不代表本地postman测试一样会成功,某些场景下两者还是有区别的。 阅读详情

相关推荐

SpringBoot中使用测试框架MockMvc来模拟HTTP请求测试Controller接口

上面讲了开发过程中一些测试方法。如果需要在代码中直接测试某个Controller接口,除了每次启动项目后使用postman等测试工具测试外,还可以使用MockMvc进行测试。

BADAO_LIUMANG_QIZHI的博客 1736

Mock单元测试----对Controller层进行单独测试,不调用Service层

Mock单元测试----对Controller层进行单独测试,不调用Service层

Sourbing的博客 2546

MS建模mmt

一、流程:1.定义好每个原子力场类型:Edit Sets(分组) 2.加H(一般是仅与Al-O八面体中的Al相连的O原子)、给H分组 3.“make P1”、校核化学式(正确与否) 4.扩成超晶胞(Na-mmt:4*1*1,Ca-mmt:4*2*1,illite:2*1*1,由化学式而定) 5.置换阳离子: mmt:模型中每 32 个 Si 4+有 1 个被 Al 3+ 取...

weixin_30721899的博客 2174

SpringBoot使用MockMVC单元测试Controller

对模块进行集成测试时,希望能够通过输入URL对Controller进行测试,如果通过启动服务器,建立http client进行测试,这样会使得测试变得很麻烦,比如启动速度慢,测试验证不方便,依赖网络环境等,这样会导致测试无法进行,为了可以对Controller进行测试,可以通过引入MockMVC进行解决。

人生不怕起点低,就怕没追求 1371

利用VS2019编写安卓APP的步骤和所遇问题的解决办法

遇到了代码错误,这个可以将鼠标箭头置于错误代码处,这样VS2019给你解决办法,给的方法不能解决,并且读了程序都没有问题,那么你应该重启软件,这样还是不能解决,你尝试重新生成解决方案,还是不能解决有可能是运用的代码与当前版本不相符和、过时了,这个时候应当运用相应版本的代码。注:VS2019编写APP的空间不是很稳定,当你写的代码没有问题,但是出现了报错,可能是空间崩溃了,这个时候可以重启软件。点击“+”号,创建密钥存储,输入“别名”、“密码”、以及下面中的任意一项,直至红色框消失后。

youbestcando的博客 7814

详细解读文字识别工具———Tesseract-OCR

   在尝试破解12306验证码的时候,提前了解了一下应对各种验证码的解决方案,这里主要是学习到了面对文字图片验证码,例如亚马逊、豆瓣等平台的登录时会遇到的情况,效果还不错。 一、工具介绍 ​    Tesseract-OCR 是一款由HP实验室开发由Google维护的开源OCR(Optical Character Recognition...

别看我只是一只羊 2万+

基于Mockito的多层模拟单元测试 小结

1.首先,我们先来了解下Mock是个什么东西吧。Mockito教程 2.基本上一些简单unit-test的mock用法可以参照上面那个教程了。我要总结的主要是分为两个方面: 1) 通过Mock来访问Controller; 参考:基于RESTful风格的SpringMVC的测试,Testing Spring MVC Controllers 2) 通过Mock来访问Controller,并...

BAStriver的博客 2793

从零到一:微信小程序Camera组件实现高效连续扫码的实战解析

本文详细解析了如何利用微信小程序Camera组件实现高效连续扫码功能,适用于零售仓储、物流配送等场景。通过优化扫码核心机制、防抖处理和图像增强技术,开发者可以突破官方API限制,打造媲美专业扫码枪的流畅体验。文章还提供了性能基准测试和高级功能扩展方案,助力企业提升操作效率。

weixin_29015051的博客 580

Mock实现单元测试报错:Argument passed to when( ) is not a mock!

其中,@InjectMocks和@Spy创建的是一个实例对象,@Mock则创建的是一个虚拟对象,@Mock可以单独使用或者和@InjectMocks共同使用,@Mock的对象会被注入到@InjectMocks中。使用Mock时我们主要会用到@InjectMocks、@Mock和@Spy这三个注解,方法则主要是doReturn-when和when-thenReturn两种方式。使用Mock进行单元测试时遇到了该问题:Argument passed to when( ) is not a mock!

qq_41112238的博客 1万+

基于STM32L4XX、HAL库的BQ27520YZFR-G4 电量监测计驱动程序设计

(可选) -------- TS (Pin 3) 连接温度传感器。(可选) -------- BAT (Pin 2) 连接电池正极。// 假设I2C1已初始化。// 每5秒更新一次。// 短暂延时确保数据准备好。支持Impedance Track™技术,提供高精度电量测量。适用于便携式设备如智能手机、平板电脑等。// 可添加初始化验证代码。// 初始化BQ27520。// 发送控制子命令。// 配置模拟滤波器。// 配置数字滤波器。// I2C1初始化函数。

zhusl6688的博客 244

【RT-DETR涨点改进】全网独家创新、细节涨点改进篇 | ICML 2024 | RT-DETR引入ICB交互式卷积模块和ASB自适应频谱模块,助力目标检测、异常检测有效涨点、含多种创新改进点

RT-DETR目标检测模型通过引入ICB和ASB模块实现性能提升。ICB模块采用多尺度卷积交互,有效捕获局部和长程依赖特征;ASB模块通过自适应频域滤波优化特征表示,降低噪声干扰。两者结合使模型在复杂场景中表现更优,显著提升检测精度和鲁棒性。文章详细介绍了模块原理、代码实现及配置方法,并提供了8种改进版本的YAML配置文件,适用于不同网络结构。这些创新改进为RT-DETR模型提供了高效涨点方案,特别适合复杂背景和高噪声环境下的目标检测任务。

Ai缝合怪、助力小伙伴高效发论文 214

SpringBoot之MockMvc单元测试

Mock的作用 问题解决 一个程序的结果判定。 1,第一步,程序编译完成之后,可以运行。第二步,与业务功能对接,在网站上进行操作,没有问题。 第一步是基础可以忽略,为了解决第二步,我们便需要测试类。 测试时的问题。 1,仅仅走一步测试,需要运行程序,搭建环境,耗费资源大。 2,硬件环境搭建不到位,如需要一个接口的温度参数,但是开发时,硬件还没有到位。 3,数据敏感问题,测试需要开放数据库,但一部分数据,我们不想公开。 mock-模拟对象就是为了解决这些问题,它模拟各种接口对象,作为一个假对

qq_41881241的博客 838

【逐函数讲解ORB_SLAM3源码】获取普通帧率、关键帧、IMU数据

获得imu的旋转 mRwc * mImuCalib.mTcb.rotationMatrix(); Sophus::SE3 mTwc 创建ORB_SLAM3系统 Create SLAM system. It initializes all system threads and gets ready to process frames. ORB_SLAM3::System SLAM(argv[1],argv[2],ORB_SLAM3::System::IMU_RGBD, true, 0, file_nam

小秋 AI SLAM 入门实战教程 1245

controller调用另一个controller中的方法 获取返回值_快速学会Springboot中编写Mock单元测试...

1.概要软件测试是一个应用软件质量的保证。java开发者开发接口往往忽视接口单元测试。作为java开发如果会Mock单元测试,那么你的bug量将会大大降低。spring提供test测试模块,所以现在小胖哥带你来玩下springboot下的Mock单元测试,我们将对controller,service 的单元测试进行实战操作。2.依赖引入按照上面引入依赖而且scope为test。该依赖提供...

weixin_40007515的博客 993

【嵌入式Linux驱动开发】二十四、Linux I2C 驱动上手尝试

  人的前程关于眼界、关乎格局。   志之所趋,无远弗届,穷山复海不能限也;   志之所向,无坚不入,锐兵精甲不能御也。 一、I2C驱动框架简介   Linux内核将 I2C 驱动分为两部分: ①、 I2C 总线驱动, I2C 总线驱动就是 SOC 的 I2C 控制器驱动,也叫做 I2C 适配器驱动。 ②、 I2C 设备驱动, I2C 设备驱动就是针对具体的 I2C 设备而编写的驱动。 1....

悟已往之不谏 知来者之可追 1070

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

[JavaWeb]_[初级]_[对Jfinal框架的Controller进行单元测试]

场景 开发JavaWeb网站时,对Service层使用JUnit测试接口还是比较容易的,因为它基本只涉及了简单的数据库操作和业务单元操作,不涉及复杂的页面导航校验,最主要的还是不需要启动应用服务器Tomcat来运行单元测试。 只测试Service层是不够的,完整的单元测试也应该包含Controller(控制层)的测试,这样可以避免耗时的浏览器点击验证流程。那么这一层如何高效的进行单元测试呢? 说明 一般应用框架都会有Controller,它会用到容器的HttpServletRequest,H

小白 3505

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

SPRING-Mock方式进行单元测试

编写测试Controller:package com.wartao.test.mock.controller;import java.util.ArrayList;import java.util.Collections;import java.util.List;import org.springframework.web.bind.annotation.PathVariable;import ...

ignorewho的博客 4016

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

利用junit对springMVC的Controller进行测试

平时对junit测试service/DAO层已经很熟悉不过了,如果不了解,可以猛戳这里,但是我们要测试controller层,不能总重启服务器吧,(重启tomcat好慢的飘过,别。。。别走啊),那么我们就用junit4模拟请求,测试controller层的方法。 代码1:直接Controller调用方法import static org.junit.Assert.*; import java.sql

拓扑 912

基于mock对象和JUnit框架简化Spring Web组件单元测试

对于Java组件开发者来说,他们都盼望拥有一组能够对组件开发提供全面测试功能的好用的单元测试。一直以来,与测试独立的Java对象相比,测试传统型J2EE Web组件是一项更为困难的任务,因为Web组件必须运行在某种服务器平台上并且它们还要与基于HTTP的Web交互细节相联系。易测性(在框架中测试每个组件而不管其具体种类)是Spring框架所提倡的关键原则之一。从这一角度看,Spring是对

冰树之家 3054

Spring Boot中如何编写优雅的单元测试

本文介绍了如何在Spring Boot中编写优雅的单元测试,包括如何添加单元测试依赖,如何对不同层次的组件进行单元测试,以及如何使用Mock对象和Spy对象来模拟真实对象行为。本文还给出了每种类型的单元测试的示例代码,并解释了其中的关键点和技巧。通过编写单元测试,可以提高Spring Boot应用的质量和稳定性,同时也可以提高开发者的编程水平和信心。希望本文能够对你有所帮助和启发,让你能够在Spring Boot中编写优雅的单元测试。

TaloyerG的博客 1万+

Mockito快速上手

关于单元测试与集成测试 单元测试:针对代码中最小可测试单元进行测试,通常就是一个方法块。单元测试只关注方法本身的业务逻辑, 不关心其余任何与外部交互的方法或接口。 集成测试:在单元测试的基础上将所有模块按照系统设计或业务规则组装为子系统或系统。 集成测试主要目的是验证各个模块之间能否顺利交互,比如第三方API能否调通。 Mockito 单元测试的基本流程: 模拟并替换测试代码中所有的外部依赖...

半斤米粉闯天下的博客 688

ASP.NET Core 对Controller进行单元测试

单元测试对我们的代码质量非常重要。很多同学都会对业务逻辑或者工具方法写测试用例,但是往往忽略了对Controller层写单元测试。我所在的公司没见过一个对Controller写过测试的。今...

dotNET跨平台 1127

别再傻等后端接口了!用Mockito 5分钟搞定Spring Boot单元测试(附完整代码)

本文详细介绍了如何使用Mockito在5分钟内快速搭建Spring Boot单元测试环境,提升开发效率。通过实战案例展示Mock测试在Controller层、Service层的应用,包括异常模拟、复杂对象处理等高频场景,帮助开发者摆脱后端接口依赖,实现并行开发与隔离测试。

weixin_30386713的博客 88

Mockito搭配junit5单元测试

mockit单元测试实现

CheerTan is here 2506

使用Mock方式进行单测时,对Spring约定配置(SecurityContextHolder)的处理

@使用Mock方式进行单测时,对Spring约定配置(SecurityContextHolder)的处理 使用Mock做Controller层单测时, 所有依赖注入的变量都需要Mock一下.如: @Controller public class IndexController { @Autowired private IConfigService configService; @Autowired private VersionVariable versionVariable; } 测试类中相应

qq_42018547的博客 1258

基于 mockMvc 的 Controller 层单元测试

场景 单元测试是个让人很纠结的东东,dealline 催的很紧,不想写单测,但当项目复杂到一定程度需要重构时,返现没有单测,不敢随便改代码,生怕”敲一锤子,倒一大片“,但此时再补,已经有点晚了。磨刀不误砍柴功,这会偷的懒后面总要跟你算账的,所以还乖乖写吧。 单测目的 这个很重要,不清楚目的,就不知道接下来该怎么做。这样也行,那样好像也可以,埋头写一大片,很快就没了兴趣,而且还会很烦写单测。常见 web 服务大都是 controller、service、repository 三层架构。每一层都有各自的任务,基

骑着蜗牛向前跑的博客 1924
上一篇: Mybatis批量提交
下一篇: 使用Swagger2构建强大的API文档
淋雨一直走啊
博客等级 码龄11年 39粉丝 46原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值