MockMvc 单元测试样例

2023-10-30

前言

老实我以前也没写过单元测试(小公司没要求),都是postman自测OK就提交了
这里第一次写,还废了点时间
做个笔记下次直接抄吧

jar包版本号

        <!-- 测试用 start -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <version>2.5.6</version>
        </dependency>
        <!-- 测试用 end -->

单元测试代码

package com.mea.pay.transaction;

import cn.hutool.core.date.DateTime;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.mea.pay.api.dto.transaction.PaymentRecordPayerRemarkUpdateDTO;
import com.mea.pay.transaction.controller.PaymentRecordController;
import com.mea.pay.transaction.dos.PaymentRecordDO;
import com.mea.pay.transaction.service.PaymentRecordService;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.http.MediaType;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.web.servlet.MockMvc;

import java.math.BigDecimal;

import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.*;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
import static org.springframework.test.web.servlet.setup.MockMvcBuilders.*;

/**
 * 支付 单元测试
 *
 * @author Heng.Wei
 * @date 2022-05-05
 **/
@ActiveProfiles("dev")
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.MOCK)
public class PaymentRecordControllerTest {

    /** 单元测试 - 支付方用户ID */
    private static final Long UNIT_TEST_PAYMENT_USER_ID = 1L;
    /** 单元测试 - 查询用的请求ID */
    private static final String UNIT_TEST_PAYMENT_RECORD_REQUEST_ID = "UNIT_TEST_1";
    /** 单元测试 - 查询用的主键ID */
    private static Long UNIT_TEST_PAYMENT_RECORD_ID;

    @Autowired
    private PaymentRecordService paymentRecordService;
    private MockMvc mockMvc;

    @BeforeEach
    void setUp() {
        mockMvc = standaloneSetup(new PaymentRecordController(paymentRecordService))
                .defaultRequest(get("/").accept(MediaType.APPLICATION_JSON))
                .alwaysExpect(status().isOk())
                .alwaysExpect(content().contentType("application/json"))
                .build();
        // 初始化测试数据
        initTestData();
    }

    /** 初始化测试数据 */
    void initTestData() {

        PaymentRecordDO recordDO = paymentRecordService.getOne(new LambdaQueryWrapper<PaymentRecordDO>() {{
            eq(PaymentRecordDO::getRequestId, UNIT_TEST_PAYMENT_RECORD_REQUEST_ID);
        }});
        if (recordDO == null) {
            recordDO = new PaymentRecordDO();
            recordDO.setRequestId(UNIT_TEST_PAYMENT_RECORD_REQUEST_ID)
                    .setAmount(new BigDecimal(100))
                    .setCurrency("USD")
                    .setPlatformId(1L)
                    .setTransChannel(1)
                    .setInitiator(UNIT_TEST_PAYMENT_USER_ID)
                    .setPayerPan("UNIT_TEST_PAN");
            paymentRecordService.save(recordDO);
        }
        UNIT_TEST_PAYMENT_RECORD_ID = recordDO.getId();
    }

    /**
     * <pre>
     * /payment/request/{requestId}
     * 根据请求唯一ID获取支付记录
     * </pre>
     **/
    @Test
    void getPaymentRecordByRequestId() throws Exception {

        mockMvc.perform(get("/payment/request/" + UNIT_TEST_PAYMENT_RECORD_REQUEST_ID)
                        .accept(MediaType.APPLICATION_JSON))
                .andDo(print())
                .andExpect(status().isOk());
    }

    /**
     * <pre>
     * /payment/{id}
     * 根据主键ID查询支付记录详情
     * </pre>
     **/
    @Test
    void getPaymentRecordById() throws Exception {
        mockMvc.perform(get("/payment/" + UNIT_TEST_PAYMENT_RECORD_ID)
                        .accept(MediaType.APPLICATION_JSON))
                .andDo(print())
                .andExpect(status().isOk());
    }

    /**
     * <pre>
     * 修改支付记录的用户备注信息
     * /payment
     * </pre>
     **/
    @Test
    void updatePaymenRecordPayerRemark() throws Exception {
        PaymentRecordPayerRemarkUpdateDTO updateDTO = new PaymentRecordPayerRemarkUpdateDTO();
        updateDTO.setId(UNIT_TEST_PAYMENT_RECORD_ID);
        updateDTO.setPayerRemark("unit test:" + DateTime.now());
        updateDTO.setPicurl("unit test");
        updateDTO.setTags("unit test");

        mockMvc.perform(put("/payment")
                        .accept(MediaType.ALL_VALUE)
                        .contentType(MediaType.APPLICATION_JSON)
                        .content(JSON.toJSONString(updateDTO))
                )
                .andDo(print())
                .andExpect(status().isOk());
    }

    /**
     * <pre>
     * /list/{userId}
     * </pre>
     **/
    @Test
    void listPaymentRecords() throws Exception {
        mockMvc.perform(get("/payment/list/" + UNIT_TEST_PAYMENT_USER_ID)
                        .accept(MediaType.APPLICATION_JSON))
                .andDo(print())
                .andExpect(status().isOk());
    }
}

测试结果

在这里插入图片描述
理论上单元测试是要求可重复验证才对,这里是OK的

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MockMvc 单元测试样例 的相关文章

  • 通过 Java Spring 构建 sitemap.xml [重复]

    这个问题在这里已经有答案了 我正在通过 Spring MVC 构建 sitemap xml XmlRootElement name urlset public class XmlUrlSet XmlElements XmlElement n
  • 使用桌面的默认应用程序打开存储在 jar 文件中的 PDF 文件

    我的计算机科学课程的程序开发即将结束 然而 要求之一是应用程序内有一份用户手册 我在 Eclipse 工作区中将用户手册保存为 PDF 它存储在 Documents PDF Manual pdf 下 我最初使用这段代码 URL url ge
  • 在总是抛出方法之后如何检测死代码?

    考虑以下代码 Test public void testDeadCode letsThrow System out println will never be reached private final void letsThrow thr
  • 找不到可接受的代表

    我是 Spring Boot 的新手 我可能会犯一些愚蠢的错误 所以提前对此类问题表示歉意 我正在尝试编写接受以下 JSON 的 POST API id null a 1 3 b somestring mapJson monday 10 0
  • 使用 Netbeans 导出 JAR

    如何使用Netbeans将java项目导出到JAR 我找不到像 Eclipse 那样的选项 您需要启用该选项 Project Properties gt Build gt Packaging gt Build JAR after compi
  • 谷歌地图返回空指针异常

    当我尝试在片段上显示地图时 它返回空指针异常 我已将所有内容添加到清单中的每个权限中 我正在附加片段文件 XML 文件和日志目录 Chatffragment java public class ChatFragment extends Fr
  • 如何在 Java 中从任意基数转换为基数 10

    我是 Java 新手 我想编写一个程序 仅使用算术运算将基数 2 3 4 5 6 7 8 9 16 转换为基数 10 我已经完成了从键盘读取字符串 如果数字是十六进制 并将其转换为整数 之后我做了一个 while 循环 将数字分割为数字并将
  • 在 Spring Boot 和 Heroku 上 GET/POST 后如何解决 503(服务不可用)?

    我已经在 Heroku 上部署了 Spring Boot 应用程序 并且构建成功 然而 当我尝试到达邮递员的终点时 我得到了503 Service Unavailable 而且 我检查了 Heroku 日志 下面的日志显示了应用程序被破坏的
  • 如何在 Java 中通过 TLS v.1.2 创建安全的 TCP 连接

    我想通过 TLS v1 2 在两个系统之间创建通信 其中包含的信息是保密的 我想避免 https Web 服务调用 而直接想在 TCP 层执行消息交换 您能否建议如何实现此功能 以便我可以通过 TLS v1 2 安全地传输数据 EDIT 阅
  • 如何用spring启动myBatis实现?

    我想与 myBatis 合作 我已阅读 MyBatis 3 用户指南 现在我正在努力实施它 最近我学习了spring 所以我很难实施 所以我需要一些有用的资源来逐步实现它 首先将 MyBatis Spring jar 添加到类路径中 从您的
  • 将 PFX 文件导入现有 JKS 文件(不从 .pfx 转换为 .jks)

    我有 Java Web 服务 并使用 Java Keytool 创建的 jks 文件实现了 X 509 keytool genkey keyalg RSA sigalg SHA1withRSA validity 730 alias myse
  • Hibernate添加带有子实体id的实体

    我的对象 状态 java Entity Table name STATE public class State Id GeneratedValue strategy GenerationType AUTO private Long id C
  • JPanel 上的圆形边框

    我这里得到的是一个带有圆形边框的 JPanel 其设置如下 panel setBorder new LineBorder PanelColor 5 true 问题是 在每个角上都有 2 条从外角到内角的对角不透明线 即边框的长度 边界后面的
  • 如何模拟类路径上属性文件的存在?

    这肯定是一个常见问题 我有一个像这样的属性文件my settings properties由应用程序类读取 当我编写测试类时 它需要测试可能存在的不同场景my settings properties为了确保最大的代码覆盖率 例如空属性文件
  • 通过反思思考工厂设计模式

    我正在对工厂模式进行研发 我开发了下面的代码 现在我知道子类是 Dog 和 Cat 但是如果我想通过在 main 中传递类名来通过反射实现同样的事情 请告诉我该怎么做 爪哇 public abstract class Animal publ
  • 如何将报告导出为 PDF/A-1a、PDF/A-1b?

    在 jasper report 中生成 PDF A 包含许多陷阱 并且某些版本的 jasper report 不支持 这就是为什么我决定通过这个Question Answer 帖子 指示将带有图表的简单报告导出为 PDF A 所需的步骤和库
  • Java ReentrantReadWriteLocks - 如何在读锁中安全地获取写锁?

    我现在在我的代码中使用可重入读写锁 http java sun com javase 6 docs api java util concurrent locks ReentrantReadWriteLock html同步对树状结构的访问 这
  • 在 Back 上按遍历最后两个选项卡在 BottomNavigationView 中无法正常工作?

    单击后退按钮后 导航到上一个打开的选项卡 您只需遍历最后打开的两个选项卡即可退出应用程序 如何实现 我只想遍历我打开的所有选项卡 然后应用程序应该退出 这是布局
  • JSP 自定义标签库:嵌套评估

    假设我有自定义标签库
  • 使用 Vaadin 生成 HTML 速度缓慢

    我是一个有问题的开发人员 目前我们的项目 使用 Vaadin 即将结束 但是 我们在其中一个视图中显示简单数据时遇到了一些麻烦 Vaadin 完成生成后 需要显示超过 500 KB 的数据 以及超过 15K 的 DOM 元素 在完成之前需要

随机推荐

  • python中摄氏度的符号咋打_linux下怎么方便的输入度数符号 °

    你的位置 问答吧 gt Linux 入门 gt 问题详情 linux下怎么方便的输入度数符号 在windows下可以用Alt 0176输入 在MAC下也有方便的方法可以输入 在linux下呢 参见 http anonymouse org c
  • maven pox.xml记录

  • STM32中SPI数据读取、调试过程中问题的探讨。

    1 SPI总线读取数据 许多STM32的SPI数据读取存在问题 举个例子 设备现需要3个命令 通过命令字才能将我们需要的数据输出 则SPI通讯过程就是 D0 gt D1 gt D2 gt 空数据 0x00 gt 读取数据 然而 由于SPI结
  • 超越DALL·E

    目录 摘要 引言 方法 文本条件扩散模型 无分类器指导的微调 图像绘画 带噪 CLIP 模型 结果 欢迎关注 CVHub 官方微信公众号 Title GLIDE Towards Photorealistic Image Generation
  • RabbitMQ内存监控及自动重启的shell脚本

    RabbitMQ内存监控及自动重启 功能简介 Shell脚本 systemd托管 这个脚本是用来监控 RabbitMQ 进程的内存占用情况 如果内存占用超过设定的阈值并且达到设定的检查次数 则自动重启 RabbitMQ 服务 功能简介 脚本
  • SaaS、PaaS、IaaS云服务模式和商业云平台设计与建设方案

    1 云计算的三种服务模式 云计算是一种新的计算资源使用模式 云端本身还是 IT 系统 所以逻辑上同样可以划分为这四层 底三层可以再划分出很多 小块 并出租出去 这有点像立体停车房 按车位大小和停车时间长短收取停车费 因此 云服务提供商出租计
  • TS 错误property does not exist on type Object

    在TypeScript中如果按JS的方式去获取对象属性 有时会提示形如Property value does not exist on type Object 的错误 具体代码如下 var obj Object Object create
  • JAVA代码规则对照表

    JAVA代码规则对照表 Try with resources should be used 应该使用带有资源的Try with resources Creating cookies without the secure flag is se
  • java 实现 AES 加解密

    package com dechnic tfoms util import org apache shiro crypto hash Sha256Hash import org slf4j Logger import org slf4j L
  • 渗透学习 信息收集

    人生在世三万天 有酒有肉小神仙 小白入坑学废集6 基本信息收集 信息收集 域名信息 敏感目录 端口扫描 旁站C段 整站分析 谷歌hacker URL采集 后台查找 CDN绕过方法 就算我不成器 你又是个什么东西 基本信息收集 信息收集 域名
  • 用Python进行数据分析——起步

    一 安装Anaconda与Jupyter notebook 在学习一门编程语言之前 选一个称手的工具至关重要 对于用Python进行数据分析而言 Anaconda与Jupyter notebook目前已成为标准环境 1 咱们知道conda是
  • js中的with()用法

    with语句 作用域名 一个可以按序检索的对象列表 通过它可以进行变量名的解析 with语句用于临时拓展作用域链 语法如下 with object statement method 这条语句将object添加到作用域链的头部 然后执行函数体
  • linux shell 的多行注释

    解决方案之一 强硬的注释 首先介绍方法 我们在C C 中 可以使用 的方式注释掉整块的代码 在Linuxshell脚本中 我们有一个变通的方法 有效的代码段 lt
  • [2018 徐州 网络赛

    题目来源 After Incident a feast is usually held in Hakurei Shrine This time Reimu asked Kokoro to deliver a Nogaku show duri
  • I/O模型

    参考链接 I O多路复用 IO多路复用之select poll epoll详解 epoll讲解 深入Go语言网络库的基础实现 I O模型 I O模型 1 1 阻塞I O模型 最常用的I O模型 默认情况下 所有文件操作都是阻塞的 比如I O
  • 【华为OD机试】玩牌高手(python, java, c++, js)

    玩牌高手 前言 本专栏将持续更新华为OD机试题目 并进行详细的分析与解答 包含完整的代码实现 希望可以帮助到正在努力的你 关于OD机试流程 面经 面试指导等 如有任何疑问 欢迎联系我 wechat steven moda email nan
  • ⭐算法入门⭐《线性枚举》简单10 —— LeetCode 剑指 Offer 17. 打印从1到最大的n位数

    文章目录 一 题目 1 题目描述 2 基础框架 3 原题链接 二 解题报告 1 思路分析 2 时间复杂度 3 代码详解 三 本题小知识 四 加群须知 一 题目 1 题目描述 输入数字 n n n 按顺序打印出从 1
  • 复制指定文件夹中的文件到另一个文件夹中(简单详细)

    操作系统 ubuntu 语言 python 要求 从文件夹中取出所有索引为 6的文件保存到新的文件夹中 完整代码如下 import os import re import shutil def copyfiles source files
  • 基于Java的仓库管理系统

    博主介绍 22届程序员一枚 源码获取加V qq2056908377 页面样式 仓储管理系统 本设计为一个基本的仓库管理系统 程序功能比较简单 贴近实际 系统用户权限控制采用RBAC0模型 权限 角色 用户 既提升了效率 也有很大的拓展性 业
  • MockMvc 单元测试样例

    前言 老实我以前也没写过单元测试 小公司没要求 都是postman自测OK就提交了 这里第一次写 还废了点时间 做个笔记下次直接抄吧 jar包版本号