SpringBoot @MockBean 导致ApplicationContext Reload带来的问题的解决方法

在基于SpringBoot的项目中,编写单元测试时,会遇到需要对一些被Spring容器管理的对象进行Mock的处理,但是这些对象可能被引用的比较多。这个时候可以使用 @MockBean 来注释相关对象。

如下面的代码片段:

package com.example.springbootdemo;

import com.example.springbootdemo.service.FillDataService;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.mock.mockito.MockBean;

@SpringBootTest
public class TestControllerTest {
    @MockBean
    private FillDataService fillDataService;

    @Test
    public void testAny() {
        System.out.println("abc");
    }
}

但使用 @MockBean 的同时,可能会带来一些隐藏的问题。因为 @MockBean 会导致 Spring的 ApplicationContext 进行多次Reload,项目中或者其他依赖的框架中,针对多次Reload的情况可能会出现异常。导致单元测试无法正常进行下去。

网上找了很久解决方案,找到了一种方案。在此记录以防以后碰到。

解决方案:
1、使用 Mockito@Mock 注解,(但是该注解mock出来的对象是没有直接被容器管理的,也就是说Spring容器中某些对象依赖这种类型的对象不是mock的。)
2、将Spring容器中与Mock对象相同类型的对象进行替换,替换为Mock对象。

代码实现可参考以下:

    @BeforeEach
    public void before() {
        mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
        GenericApplicationContext context = (GenericApplicationContext) this.webApplicationContext;
        DefaultListableBeanFactory beanFactory = (DefaultListableBeanFactory) context.getBeanFactory();
        replaceBean("cafJdbcTemplate", cafJdbcTemplate, beanFactory);
        replaceBean("holoJdbcTemplate", holoJdbcTemplate, beanFactory);
        replaceBean("cafNamedParameterJdbcTemplate", cafNamedParameterJdbcTemplate, beanFactory);
        replaceBean("holoNamedParameterJdbcTemplate", holoNamedParameterJdbcTemplate, beanFactory);
    }

    public void replaceBean(String beanName, Object o, DefaultListableBeanFactory beanFactory) {
        BeanDefinition beanDefinition = beanFactory.getBeanDefinition(beanName);
        beanFactory.removeBeanDefinition(beanName);
        beanDefinition.setBeanClassName(o.getClass().getCanonicalName());
        beanFactory.registerBeanDefinition(beanName, beanDefinition);
        beanFactory.registerSingleton(beanName, o);
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/600789.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

工业网关设备的种类、功能及其在各种工业场景中的应用-天拓四方

在快速发展的工业信息化时代,工业网关设备作为连接工业设备与云平台的桥梁,发挥着至关重要的作用。本文将详细介绍工业网关设备的种类、功能以及其在各种工业场景中的应用,帮助广大读者更深入地了解这一重要设备。 一、工业网关设备的种类 …

【Linux 基础 IO】文件系统

文章目录 1.初步理解文件2.C语言环境下的文件操作2.1 C库中 fopen、fwrite 的讲解2.2 C文件操作的实例 3.系统调用接口的讲解 1.初步理解文件 🐧① 打开文件: 本质是进程打开文件,只有程序运行起来文件才被打开; 🐧②文…

Fizzler库+C#:从微博抓取热点的最简单方法

概述 在这篇技术文章中,我们将深入研究如何利用Fizzler库结合C#语言,以实现从微博平台抓取热点信息的功能。微博作为中国乃至全球范围内具有重要影响力的社交媒体平台之一,在互联网信息传播中扮演着举足轻重的角色。通过Fizzler这一强大的.N…

【探索Java编程:从入门到入狱】Day4

🍬 博主介绍👨‍🎓 博主介绍:大家好,我是 hacker-routing ,很高兴认识大家~ ✨主攻领域:【渗透领域】【应急响应】 【Java、PHP】 【VulnHub靶场复现】【面试分析】 🎉点赞➕评论➕收…

电费自动抄表是什么?什么叫电费自动抄表?

1.电费自动抄表:简述 电费自动抄表是一种现代化电力工程管理方法,根据远程系统收集解决电度表数据,取代了传统的人工抄水表方法。这项技术提高了效率,降低了不正确,并且为消费者和电力公司提供了更多服务项目概率。 …

基于51单片机ESP8266wifi控制机器人—送餐、快递

基于51单片机wifi控制机器人 (程序+原理图+PCB+设计报告) ​功能介绍 具体功能: 1.L298N驱动电机,机器人行走; 2.装备红外线感应检测到周围环境,进行行程判断&#xf…

Windows环境编译 VVenC 源码生成 Visual Studio 工程

VVenC介绍 Fraunhofer通用视频编码器(VVenC)的开发是为了提供一种公开可用的、快速和有效的VVC编码器实现。VVenC软件基于VTM,其优化包括软件重新设计以减轻性能瓶颈、广泛的SIMD优化、改进的编码器搜索算法和基本的多线程支持以利用并行。此外,VVenC支…

124.反转链表(力扣)

题目描述 代码解决(思路1:双指针) class Solution { public:ListNode* reverseList(ListNode* head) {ListNode*temp;//保存cur下一个节点ListNode*curhead;ListNode*preNULL;while(cur){tempcur->next;// 保存一下 cur的下一个节点&#…

uniapp 监听APP切换前台、后台插件 Ba-Lifecycle

监听APP切换前台、后台 Ba-Lifecycle 简介(下载地址) Ba-Lifecycle 是一款uniapp监听APP切换前台、后台的插件,简单易用。 截图展示 也可关注博客,实时更新最新插件: uniapp 常用原生插件大全 使用方法 在 script…

Spring事件

📝个人主页:五敷有你 🔥系列专栏:Spring⛺️稳中求进,晒太阳 Spring事件 简洁 Spring Event(Application Event)就是一个观察者模式,一个bean处理完任务后希望通知其他Bean的…

数据交换和异步请求(JSONAjax))

目录 一.JSON介绍1.JSON的特点2.JSON的结构3.JSON的值JSON示例4.JSON与字符串对象转换5.注意事项 二.JSON在Java中的使用1.Javabean to json2.List to json3.Map to JSONTypeToken底层解析 三.Ajax介绍1.介绍2.Ajax经典应用场景 四.Ajax原理示意图1. 传统web应用2.Ajax方法 五.…

突然断电,瀚高数据库启动失败

服务器临时断电后,数据库启动不起来 ps -ef|grep postgres 进到数据库的data目录下看下ls 看下 查看临时文件: ls -la /tmp 把这两个5866的文件改个名字张老师 加个bak就行 改完了pg_ctl start起一下

618挑选家用洗地机,需要注意哪些事项?有哪些家用洗地机值得买?

近年来,智能清洁家电越来越受到消费者的欢迎,洗地机作为清洁家电的新宠,凭借其集扫地、拖地、杀菌清洗于一体的强大功能,成为市场上的热销产品。那么,这类洗地机真的好用吗?怎么挑选到好用的家用的洗地机呢…

风电厂数字孪生3D数据可视化交互展示构筑智慧化电厂管理体系

随着智慧电厂成为未来电力企业发展的必然趋势,深圳华锐视点紧跟时代步伐,引领技术革新,推出了能源3D可视化智慧管理系统。该系统以企业现有的数字化、信息化建设为基础,融合云平台、大数据、物联网、移动互联、机器人、VR虚拟现实…

BUUCTF [极客大挑战 2019]EasySQL 1

BUUCTF:https://buuoj.cn/challenges 题目描述: [极客大挑战 2019]EasySQL 1 密文: 解题思路: 1、根据题目提示,并且网站也存在输入框,尝试进行SQL注入。 首先,判断提交方式,随机输入数据…

EtherCAT开发_4_分布时钟知识点摘抄笔记1

分布时钟 (DC,Distributed Cl ock) 可以使所有EtherCAT设备使用相同的系统时间,从而控制各设备任务的同步执行。从站设备可以根据同步的系统时间产生同步信号,用于中断控制或触发数字量输入输出。支持分布式时钟的从站称为 DC 从站。分布时钟…

常见的容器技术有哪些

容器技术是一种轻量级的软件封装方式,它将软件代码及其依赖项打包在一起,这样应用可以在任何支持容器的系统上无缝运行。它允许应用程序及其依赖项在一个隔离的环境中运行,这个环境被称为容器。容器技术有助于提高应用程序的可移植性、一致性…

算法提高之能量项链

算法提高之能量项链 核心思想&#xff1a;区间dp 通过观察发现可以将n个珠子最后的n1个数看作石子 合并石子 在l~r的范围内 找k作隔断 #include <iostream>#include <cstring>#include <algorithm>using namespace std;const int N 110,M N<<…

景源畅信:个人抖音小店怎么开通?

在数字时代的浪潮中&#xff0c;个体创业已不再是遥不可及的梦想。特别是随着短视频平台的崛起&#xff0c;抖音不仅成为人们娱乐消遣的新宠&#xff0c;更是众多创业者眼中的“新大陆”。你是否也曾憧憬过在抖音上开一家属于自己的小店?那么&#xff0c;如何开通个人抖音小店…

[微信小程序] 入门笔记2-自定义一个显示组件

[微信小程序] 入门笔记2-自定义一个显示组件 0. 准备工程 新建一个工程,删除清空app的内容和其余文件夹.然后自己新建pages和components创建1个空组件和1个空页面. 设定 view 组件的默认样式,使其自动居中靠上,符合习惯.在app.wxss内定义,作用做个工程. /**app.wxss**/ /* 所…
最新文章