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 小米 华为 单反 装机 图拉丁
 
   -> 开发测试 -> 搭建大型分布式服务(三十三)SpringBoot 单元测试Mock如何根据参数返回结果? -> 正文阅读

[开发测试]搭建大型分布式服务(三十三)SpringBoot 单元测试Mock如何根据参数返回结果?

系列文章目录



前言

SpringBoot支持集成Mockito做单元测试,我们在本地做单元测试测试的时候,经常因为环境等问题需要mock掉外部方法(远程调用、DB查询等),在Mock掉的同时,如果也想根据入参条件返回mock结果,需要怎样做呢?


一、本文要点

接前文,我们已经已介绍SringBoot如果做单元测试了,本文介绍在两种mock模式下,怎样根据入参返回自定义mock结果。
系列文章完整目录

  • SpringBooot 单元测试
  • Mockito 单元测试
  • MockBean、SpyBean 单元测试
  • 根据入参自定义mock结果

二、开发环境

  • jdk 1.8
  • maven 3.6.2
  • springboot 2.4.3
  • idea 2020
  • junit5
  • Mockito

三、编写真实Service类TagService.java

编写一个方法,无实际意义,模拟真实应用场景。

@Slf4j
@Getter
@Service("tagService")
public class TagService {

	// 这里模拟超级复杂的远程方法调用
    public String buildTagName(String bId) {
        return "";
    }
}

四、编写测试类

1、@MockBean 通常使用when().thenAnswer()模式来测试。

@Slf4j
@ActiveProfiles("dev")
@ExtendWith(SpringExtension.class)
@SpringBootTest
class TagServiceTest {

    /**
     * 这里使用MockBean,tagService中所有方法都会被mock掉.
     */
    @MockBean
    private TagService tagService;
    
    @Test
    void buildTagName() {

        String bid = "45345xclm34kxjL";

        // 这段代码的含义:当执行tagService.buildTagName(bid)方法时,将会被thenAnswer()中的内容替换
        // thenAnswer()中的方法:根据入参,判断是否为正确bId,是的话返回正确的mock结果,否则返回错误的mock结果
        // 这里只是随便举例,可以根据实际情况编写mock逻辑
        Mockito.when(tagService.buildTagName(bid)).thenAnswer(
                invocation -> Optional.of(invocation.getArgument(0))
                        .filter(x -> x.equals(bid)).map(x -> "TAG" + x).orElse("ERROR"));

        // 模拟调用buildTagName()方法
        Assertions.assertEquals(tagService.buildTagName(bid), "TAG" + bid);
        Assertions.assertNotEquals(tagService.buildTagName("error bid"), "TAG" + bid);

    }
}

2、@SpyBean 需要使用doAnswer().when()模式来测试。

@Slf4j
@ActiveProfiles("dev")
@ExtendWith(SpringExtension.class)
@SpringBootTest
class TagServiceTest {

    /**
     * 这里使用MockBean,tagService中所有方法都会被mock掉.
     */
    @MockBean
    private TagService tagService;
    
    @Test
    void buildTagName() {

        String bid = "45345xclm34kxjL";

        // 这段代码的含义:当执行tagService.buildTagName(bid)方法时,将会被thenAnswer()中的内容替换
        // thenAnswer()中的方法:根据入参,判断是否为正确bId,是的话返回正确的mock结果,否则返回错误的mock结果
        // 这里只是随便举例,可以根据实际情况编写mock逻辑
        Mockito.doAnswer(invocation -> Optional.of(invocation.getArgument(0))
                .filter(x -> x.equals(bid)).map(x -> "TAG" + x).orElse("ERROR"))
                .when(tagService).buildTagName(bid);

        // 模拟调用buildTagName()方法
        Assertions.assertEquals(tagService.buildTagName(bid), "TAG" + bid);
        Assertions.assertNotEquals(tagService.buildTagName("error bid"), "TAG" + bid);

    }
}

四、小结

至此,我们就实现了通过入参来自定义mock结果啦,下一篇《搭建大型分布式服务(三十四)Junit5如何在所有测试用例前执行初始化方法?

加我加群一起交流学习!更多干货下载、项目源码和大厂内推等着你

  开发测试 最新文章
pytest系列——allure之生成测试报告(Wind
某大厂软件测试岗一面笔试题+二面问答题面试
iperf 学习笔记
关于Python中使用selenium八大定位方法
【软件测试】为什么提升不了?8年测试总结再
软件测试复习
PHP笔记-Smarty模板引擎的使用
C++Test使用入门
【Java】单元测试
Net core 3.x 获取客户端地址
上一篇文章      下一篇文章      查看所有文章
加:2022-02-26 12:01:59  更:2022-02-26 12:02:06 
 
开发: 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:33:26-

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