@Mock @MockBean @InjectMocks之间的关系

2023/11/29 14:13:12

首先说@mock 和 @MockBean
具体的介绍大家可以看
https://blog.csdn.net/dlf123321/article/details/127931154?spm=1001.2014.3001.5501

一言以蔽之就是
@Mock可以生产一个空的类,这个类的方法体都是空的,方法的返回值(如果有的话)都是null。
@MockBean可以生产一个空的类,并且用这个类替代spring容器中同类型的类。

而@InjectMocks就是产生一个空的类,这个类里面的字段用这个测试类里面被@Mock的字段填充。

@SpringBootTest
public class MockitoTest {

    @MockBean
    private MyService myService;

    @InjectMocks
    private  UserController userController;
 @Test
    public void testGet(){


        Person person = new Person();
        person.setName("张三");
        Long id = 15L;
        when(personMapper.selectById(id)).thenReturn(person);
        when(myService.say()).thenReturn("by mock");
        Person result = userController.getUserById(id);

    }

我写了上面的测试代码,发现不论怎么运行,userController里面的MyService 字段都是null,感觉就是userController里面MyService 字段上面的autowired没有起作用。
我一直在调整代码,发现了如下的情况

  • 前提条件
    ClassB里面有个ClassA,classa被标注了Autowired

  • case1
    测试类上只有 @ExtendWith(MockitoExtension.class) 的情况下 测试类里被 @MockBean 标注的字段就是空的

  • case2
    测试类上只有 @ExtendWith(SpringExtension.class)的情况下
    测试类里被 @MockBean 标注的字段(假定为ClassA)不是空的
    但是被 @InjectMocks标注的类(假定为ClassB)
    ClassB里面标注了Autowired的ClassA依然是null

  • case3
    @SpringBootTest 里面本身就包含着 @ExtendWith(SpringExtension.class)
    如果测试类上只有 @SpringBootTest 测试类里被 @MockBean 标注的字段(假定为ClassA)不是空的
    但是被 @InjectMocks标注的类(假定为ClassB)
    ClassB里面标注了Autowired的ClassA依然是null

  • case4
    如果测试类上只有 @ExtendWith(MockitoExtension.class)
    测试类里被 @Mock标注的字段不是null,也能正常的注入被 @InjectMocks标注的类

  • case5
    如果测试类上只有 @SpringBootTest
    虽然测试类里classB被标注了 @InjectMocks
    但是classB里面的classA依然是null 即使代码里面的ClassA类上标注了 @Component

看到我头都大了。
我的目标就是把 @MockBean标注的类注入到@InjectMocks里面。但是一直不行。

最终我把@InjectMocks改成了@autowired 发现可以注入了
但是被标注了@autowired里面缺不能注入被标注了@mock的字段!

最终得到一个结论
被@InjectMocks标注的字段,只能被注入被@mock标注的类(@mockbean标注的不行)
被@autowired标注的字段,只能被注入被@mockbean标注的类(@mock标注的不行)


http://www.jnnr.cn/a/140361.html

相关文章

类型转换C11

类型转换 C类型转换分为显式类型转换和隐式类型转换 ,隐式类型转换由编译器自动完成,这里只讨论显式类型转换。 旧式风格的类型转换 type(expr); // 函数形式的强制类型转换 (type)expr; // C语言风格的强制类型转换现代C风格的类型转换 cast-name&l…

【JVM】jvm的体系结构

JVM体系结构如下图所示: JVM大致可以分为五大模块: 类加载子系统(Class Loader SubSystem)运行时数据区(Runtime Data Area)执行引擎(Execution Engine)Java本地接口(Ja…

实战十八:通过ItemKNN算法实现基于协同过滤的商品推荐 代码+数据

项目概述: 推荐系统任务描述:通过用户的历史行为(比如浏览记录、购买记录等等)准确的预测出用户未来的行为;好的推荐系统不仅如此,而且能够拓展用户的视野,帮助他们发现可能感兴趣的却不容易发现的item;同时将埋没在长尾中的好商品推荐给可能感兴趣的用户。ItemKNN推荐…

MySQL进阶实战8,分区表详解

目录一、分区表二、分区的作用三、分区的一些限制四、分区表的增删改查1、select2、insert3、delete4、update五、分区表的类型六、如何使用分区表七、分区表会有哪些问题?1、分区列和索引列不匹配2、选择分区的成本可能很高3、打开并锁住所有底层表的成本可能会很高…

智慧林业解决方案-最新全套文件

智慧林业解决方案-最新全套文件一、建设背景二、建设架构1、火险预警2、AI林火分析3、应急指挥4、森林资源GIS5、林业巡检6、林业OA三、建设方案四、获取 - 智慧林业全套最新解决方案合集一、建设背景 森林资源是林地及其所生长的森林有机体的总称,以林木资源为主&…

JS 类总结

类 class 关键字是 ES6 新增的。类(class)是ECMAScript 中新的基础性语法糖,本质上还是一个函数,但实际上它使用的仍然是原型和构造函数的概念。并且类受块级作用域限制。 class Person { } console.log(Person);// class Perso…

山东大学线性代数-1-矩阵-1

目录 1.2 几种特殊的矩阵 1.2.1 方阵 1.2.2 零矩阵 1.2.3 对角矩阵 1.2.4 单位矩阵 1.2.5 数量矩阵 1.2.6 三角阵 1.2.7 梯形阵 1.3 矩阵的运算(一) 1.3.1 相等 1.3.2 加、减法 1.3.3 数乘 1.3.4 矩阵的乘法 1.4 矩阵的运算(二&#x…

Day08--自定义组件的样式

提纲挈领: ************************************************************************************************************ 我的操作: 1》在app.wxss里面定义一个全局样式: 2》在home.wxml里面使用全局样式。 3》在test2.wxml里面使用…

idea如何设置代理实现管理突破呢

📢📢📢📣📣📣 哈喽!大家好,我是「奇点」,江湖人称 singularity。刚工作几年,想和大家一同进步🤝🤝 一位上进心十足的【Java ToB端大厂…

【Java八股文总结】之反射

文章目录Java反射一、泛型1、何为泛型?2、泛型通配符Q:泛型擦除是什么?3、泛型上限和下限二、反射1、何为反射?2、反射有什么用?3、反射应用场景有哪些?Q:反射的优缺点?4、反射获取C…

基于Kubernetes与云原生的存储测试基准CNSBench

CNSBench A Cloud Native Storage Benchmark基础知识CNSBench的摘要与介绍Kubernetes BackgroundKubernetes的工作流程CNSBench提出的需求分析CNSBench设计与实现CNSBench的示意图CNSBench的基准自定义资源基准自定义资源定义基准自定义资源实例基准测试控制器性能测试与实验测…

向毕业妥协系列之深度学习笔记(三)DL的实用层面(上)

目录 一.训练_开发_测试集 二.方差与偏差 三.正则化 四.Dropout正则化 五.其他正则化方法 本篇文章大部分又是在ML中学过的,除了Dropout正则化及之后的部分。 一.训练_开发_测试集 在配置训练、验证和测试数据集的过程中做出正确决策会在很大程度上帮助大家创…

C++模拟OpenGL库——图片处理及纹理系统(三):图片缩放操作:简单插值二次线性插值

目录 简单插值 二次线性插值 简单插值 如图,我们想把一张小图缩放成一张大图,自然的想法就是按照它们的长宽比例进行缩放(zoomX)。 但是问题也显而易见,在缩放的过程中,小图的像素并不能一一映射到大图的…

蒸馏+Distilling Knowledge via Knowledge Review论文笔记

文章目录一、前言二、蒸馏1.背景介绍2.知识蒸馏和迁移学习之间的区别3.Hinton提出的知识蒸馏Pipeline4.蒸馏的知识形式5.知识蒸馏的方法三、Distilling Knowledge via Knowledge Review论文笔记1.思想介绍2.Pipeline3.实验结果参考文献一、前言 近期在阅读cvpr 2021的一篇关于蒸…

第三章:高精度算法(加、减、乘、除)

高精度算法高精度的整体思路:一、加法1、思路:2、模板:(1)C版:(2)C语言版:二、减法1、思路:2、模板:CC三、乘法1、思路:2、模板&#…

跑步时戴什么耳机好、分享五款最适合跑步的运动耳机排名清单

在进行户外跑步、骑行等运动,往往会感到枯燥乏味,很难坚持下去,就像我经常跑一圈就觉得没了动力,但是当我戴上耳机听音乐跑步时,不知不觉就结束了,就感觉时间过得很快。不过话有说回来,适合跑步…

Python 对象保存优化机制

Python 为了减少开销与内存的使用而设置一些规则: * 1. 但凡是不可变对象, 在同一个代码块中的对象, 只要是值相同的对象, 就不会重复创建, 而是直接引用已经存在的对象.交互环境下: 不写在一行, 字符类型数据指向一个内存地址, 整型超出小整数则执指向不同的地址. 代码块缩进相…

大一作业HTML网页作业:简单的旅游 1页 (旅游主题)

⛵ 源码获取 文末联系 ✈ Web前端开发技术 描述 网页设计题材,DIVCSS 布局制作,HTMLCSS网页设计期末课程大作业 | 游景点介绍 | 旅游风景区 | 家乡介绍 | 等网站的设计与制作 | HTML期末大学生网页设计作业,Web大学生网页 HTML:结构 CSS&…

一文快速学会hadoop完全分布式集群搭建,很详细

文章目录前言一、准备工作二、克隆三台虚拟机并进行网络配置克隆虚拟机克隆引导修改网络配置验证验证方式一验证方式二三、安装jdk和hadoop四、ssh免密登录配置概述生成公钥和私钥把公钥拷贝到三台虚拟机上面去验证把hadoop103 和 hadoop104的免密登录配置安装上面的操作再做一…

Tilemap瓦片资源

1、Tilemap Tilemap一般称之为 瓦片地图或者平铺地图,是Unity2017中新增的功能,主要用于快速编辑2D游戏中的场景,通过复用资源的形式提升地图多样性 工作原理就是用一张张的小图排列组合为一张大地图 它和SpriteShape都是用于制作2D游戏的…
最新文章