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

embedded/2024/10/18 9:21:03/

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

如下面的代码片段:

java">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 {@MockBeanprivate FillDataService fillDataService;@Testpublic void testAny() {System.out.println("abc");}
}

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

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

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

代码实现可参考以下:

java">    @BeforeEachpublic 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.ppmy.cn/embedded/35825.html

相关文章

Elementui的el-footer标签使用报错

Elementui的el-footer标签使用报错 其余标签的使用没有报错信息 el-footer的报错信息 原因: ​ 警告信息表示 Vue 不识别 <el-footer> 解决方式: 在组件中进行引入和暴露

【Java从入门到精通】Java继承

继承的概念 继承是java面向对象编程技术的一块基石&#xff0c;因为它允许创建分等级层次的类。 继承就是子类继承父类的特征和行为&#xff0c;使得子类对象&#xff08;实例&#xff09;具有父类的实例域和方法&#xff0c;或子类从父类继承方法&#xff0c;使得子类具有父…

qt5-入门-QTableWidget-嵌套的表格

参考&#xff1a; C GUI Programming with Qt 4, Second Edition 本地环境&#xff1a; win10专业版&#xff0c;64位&#xff0c;Qt5.12 所有代码已经跑通。 仅供个人记录、积累。 目录 基础版效果实现如何获取QTableWidget的默认行高&#xff1f;代码 无边框版效果实现 基…

最简单的自动化爬虫工具--Playwright

Playwright Playwright是一款强大的自动化库&#xff0c;提供了一种简便易用、高性能的网页自动化解决方案。它支持同步和异步两种操作方式&#xff0c;用户无需为不同浏览器单独下载驱动程序&#xff0c;因为Playwright内置了对Chrome、Firefox、Safari等多种浏览器的支持。此…

Windows 下启动 jar 后隐藏cmd 窗口

编写BAT脚本文件如下 方法一 echo off # 获取当前执行脚本的目录 set jarPath%~dp0 # 使用 javaw 启动一个jar start javaw -jar %jarPath%xxx.jar方法二 echo off # 获取当前执行脚本的目录 set jarPath%~dp0 # 使用vb脚本方式处理 cmd 窗口 %1 mshta vbscript:CreateObjec…

产业园物业满意度调研问卷设计

本文由群狼调研&#xff08;长沙物业竞争对手分析&#xff09;出品&#xff0c;欢迎转载&#xff0c;请注明出处。设计产业园物业满意度调研问卷时&#xff0c;可以考虑以下要点&#xff1a; 1.个人信息&#xff1a;收集参与者的基本信息&#xff0c;如姓名、职务、所在企业等&…

互斥量理论基础

文章目录 一、互斥量理论基础 一、互斥量理论基础 在多任务系统中&#xff0c;任务A正在使用某个资源&#xff0c;还没用完的情况下任务B也来使用的话&#xff0c;就会出问题。这时就需要互斥量&#xff08;互斥锁&#xff09;&#xff0c;使用过程如下&#xff1a; 互斥量初始…

3.栈和队列(汇总版)

目录 1.栈&#xff08;一端插和删&#xff09; 2.队列&#xff08;一端插另一段删&#xff09; 2.1队列的概念及结构 2.2 队列的实现 队列的接口 1.初始化队列 2.销毁队列 3.插入元素 4.出队列&#xff08;头删&#xff09; 5.访问对头 6.访问队尾 7.判断队列是否为…