IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发测试 -> 基于 mockMvc 的 Controller 层单元测试 -> 正文阅读

[开发测试]基于 mockMvc 的 Controller 层单元测试

场景

单元测试是个让人很纠结的东东,dealline 催的很紧,不想写单测,但当项目复杂到一定程度需要重构时,返现没有单测,不敢随便改代码,生怕”敲一锤子,倒一大片“,但此时再补,已经有点晚了。磨刀不误砍柴功,这会偷的懒后面总要跟你算账的,所以还乖乖写吧。

单测目的

这个很重要,不清楚目的,就不知道接下来该怎么做。这样也行,那样好像也可以,埋头写一大片,很快就没了兴趣,而且还会很烦写单测。常见 web 服务大都是 controller、service、repository 三层架构。每一层都有各自的任务,基于此单测的目的也就不同。

  • repository 层主要负责数据的持久化,它里面除了读和写,其他的逻辑越少越好。所以该层单测要连上数据库,将数据真正的写入并且读出,从而确认该数据持久化,以及各种查找功能正确。推荐持久化层单测内嵌 H2 数据库,它是基于内存的,不受物理机限制,而且各个单测 case 之间互无影响。
  • service 层负责处理业务逻辑,很复杂的项目往往也就是复杂在这一层了,这层肯定会依赖该项目的 repository 层,还可能会依赖 Redis、kafka、mq、httpClinet 等第三方的东西。每次单测都调用第三方,哪有那么听话的第三方,每次都能正确返回结果。这层单测怎么写?把 service 层依赖的 repository 和 第三方的东西都 mock 出来,并 when 他们对应的方法,按照测试需求控制其方法返回值,从而控制 service 层的方法中代码的走向,确认自己写的逻辑是没问题的。在这一层中,一个方法往往需要好几个测试 case,一个正例,若干的异常情况。
  • controller 层负责和前端交互,接收请求、校验参数、返回处理结果。最理想的单测肯定是模拟出生产环境下前端请求的执行。这是可以办到的。

三层单测有各自的目的,而且不依赖于其余两层,如果真依赖了,那就使用 mock,控制返回值。从而实现“隔离”,本层单测只需要实现本层的目的,其余的都是不需要知道的。

controller 层单测

mockMVC 可以实现在单测中模拟生产环境中前端请求的执行逻辑。

Controller:

@RestController
@RequestMapping("/trains")
public class TrainController {

    private TrainService trainService;

    @Autowired
    public TrainController(TrainService trainService) {
        this.trainService = trainService;
    }

    @PostMapping("")
    public void create(@RequestBody @Validated ModelTrainsAddDTO req) {
        TrainEntity entity = new TrainEntity();
        BeanUtils.copyProperties(req, entity);
        trainService.create(entity);
    }
}

@Data
@NoArgsConstructor
@AllArgsConstructor
public class ModelTrainsAddDTO {
    @NotBlank
    private String name;
    private String modelType;
}

单元测试

@WebMvcTest(TrainController.class)
class TrainControllerTest {
    @MockBean
    private TrainService trainService;

    @Autowired
    private MockMvc mockMvc;

    @BeforeEach
    void setUp() {
        RestAssuredMockMvc.mockMvc(mockMvc);
    }

    @Test
    void should_200_if_create_train_succeed() {
        ModelTrainsAddDTO param = new ModelTrainsAddDTO("name", "model-type", "trian-fileds", "evail-files", "param");
        given()
                .contentType(ContentType.JSON)
                .body(param)
                .when()
                .post("/trains")
                .prettyPeek()
                .then()
                .statusCode(200);

        verify(trainService).create(any());
    }

    // 注解校验没通过,直接抛异常。
    @Test
    void should_500_if_name_is_null_when_create_train() {
        ModelTrainsAddDTO param = new ModelTrainsAddDTO(null, "model-type", "trian-fileds", "evail-files", "param");

        given()
                .contentType(ContentType.JSON)
                .body(param)
                .when()
                .post("/trains")
                .prettyPeek()
                .then()
                .statusCode(500);
    }
}

RestAssuredMockMvc

RestAssuredMockMvc 详细使用方法在这里,需要科学上网。它采用熟悉的 given-when-then 的场景格式定义测试写法,里面有段这样的描述:

given() — specifies the HTTP request details
when() — specifies the HTTP verb as well as the route
then() — validates the HTTP response

当然也还有别的写法,比如:mockMvc.perform()

依赖

<dependency>
	<groupId>io.rest-assured</groupId>
  <artifactId>spring-mock-mvc</artifactId>
  <version>4.5.1</version>
  <scope>test</scope>
</dependency>
  开发测试 最新文章
pytest系列——allure之生成测试报告(Wind
某大厂软件测试岗一面笔试题+二面问答题面试
iperf 学习笔记
关于Python中使用selenium八大定位方法
【软件测试】为什么提升不了?8年测试总结再
软件测试复习
PHP笔记-Smarty模板引擎的使用
C++Test使用入门
【Java】单元测试
Net core 3.x 获取客户端地址
上一篇文章      下一篇文章      查看所有文章
加:2022-03-08 22:52:24  更:2022-03-08 22:52:44 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/18 2:31:26-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码