如何處理mocking is already registered in the current thread

根據錯誤信息 ??"static mocking is already registered in the current thread"?,這是在 Jenkins 運行單元測試時出現的 Mockito 靜態模擬沖突問題。以下是完整的原因分析和解決方案:


?問題原因?

  1. ?靜態模擬未正確關閉?
    Mockito 通過 MockedStatic<T> 對象管理靜態方法的模擬。當在測試中多次初始化同一個類的靜態模擬(如 IPUtil)?而沒有關閉前一個實例時,會觸發此錯誤。

  2. ?并發測試線程干擾?
    Jenkins 可能并行執行測試,如果某個測試未清理靜態模擬狀態,后續測試在同一線程中嘗試注冊新模擬時會沖突。

  3. ?JUnit 生命周期管理不當?
    使用了 @Before/@BeforeEach 初始化模擬,但未在 @After/@AfterEach 中關閉,導致模擬對象泄漏到其他測試。


?解決方案?

方法 1:確保每個測試后關閉靜態模擬(推薦)

在測試類中顯式管理 MockedStatic 的生命周期:

import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.MockedStatic;
import org.mockito.Mockito;class IPUtilTest {private MockedStatic<IPUtil> mockedIPUtil; // 聲明成員變量@BeforeEachvoid setup() {mockedIPUtil = Mockito.mockStatic(IPUtil.class); // 初始化}@AfterEachvoid tearDown() {mockedIPUtil.close(); // 關鍵!每個測試后關閉模擬}@Testvoid testMethod1() {mockedIPUtil.when(IPUtil::getIP).thenReturn("192.168.1.1");// 測試邏輯}
}
方法 2:使用 Try-with-Resources(適合單方法)

如果測試方法獨立,可在方法內部直接管理:

@Test
void testMethod2() {try (MockedStatic<IPUtil> mockedIPUtil = Mockito.mockStatic(IPUtil.class)) {mockedIPUtil.when(IPUtil::getIP).thenReturn("192.168.1.1");// 測試邏輯} // 自動關閉(實現 AutoCloseable)
}
方法 3:檢查并發測試配置

如果 Jenkins 使用 ?并行測試執行?(如 Maven Surefire 的 parallel=methods),確保測試間無狀態共享:

<!-- Maven 配置示例:禁用并行 -->
<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-surefire-plugin</artifactId><configuration><parallel>none</parallel> <!-- 關閉并行 --></configuration>
</plugin>
方法 4:驗證 Mockito 版本兼容性

過時的 Mockito 版本可能存在 Bug。確保使用 ?Mockito 3.12+?? 或 ?4.x?:

<dependency><groupId>org.mockito</groupId><artifactId>mockito-core</artifactId><version>5.1.1</version> <!-- 推薦最新版 --><scope>test</scope>
</dependency>

?預防措施?

  1. ?避免全局靜態模擬?
    不要在 static 塊或 @BeforeClass 中初始化靜態模擬(因其生命周期貫穿整個測試類)。

  2. ?清理工具類模板?
    創建測試基類封裝靜態模擬管理:

    public abstract class BaseMockitoTest {protected MockedStatic<IPUtil> mockedIPUtil;@BeforeEachpublic void initMocks() { mockedIPUtil = Mockito.mockStatic(IPUtil.class); }@AfterEachpublic void releaseMocks() { if (mockedIPUtil != null) mockedIPUtil.close(); }
    }
  3. ?日志與調試?
    在 Jenkins 測試中添加日志,定位未關閉模擬的具體測試:

    @AfterEach
    void tearDown() {System.out.println("Closing static mock for test: " + this.getClass().getName());mockedIPUtil.close();
    }

?總結?

核心問題是 ?**MockedStatic 實例未關閉**,導致線程上下文殘留模擬狀態。通過:

  1. @AfterEach 中強制調用 .close()
  2. 避免跨測試共享 MockedStatic 對象,
  3. 禁用并行執行(如需),
    即可徹底解決此問題。推薦優先使用方法 1 或方法 2。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/913825.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/913825.shtml
英文地址,請注明出處:http://en.pswp.cn/news/913825.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

貨車車架和懸架設計cad【7張】+設計說明書

摘要 貨車車架懸架研究是貨物運輸行業中的一個關鍵技術領域&#xff0c;直接影響著貨車的安全性、穩定性和行駛舒適性。本文主要說明了載貨汽車車架與懸架系統設計的設計計算過程&#xff0c;主要分為設計和校核兩大部分。 設計部分主要敘述了載貨汽車車架與懸架系統設計的要求…

HTTP 錯誤 500.19 - 打開 IIS 網頁時出現內部服務器錯誤

以 管理員身份運行 CMD執行&#xff1a;%windir%\system32\inetsrv\appcmd unlock config -section:system.webServer/handlers%windir%\system32\inetsrv\appcmd unlock config -section:system.webServer/modules

Vue.js 過渡 動畫

Vue.js 過渡 & 動畫 引言 隨著前端技術的發展,用戶體驗越來越受到重視。在Vue.js框架中,過渡和動畫是提高用戶體驗的重要手段。通過使用過渡和動畫,我們可以使頁面元素的變化更加平滑,提升用戶界面的視覺效果。本文將詳細介紹Vue.js中的過渡和動畫功能,幫助開發者更…

【大模型推理論文閱讀】Enhancing Latent Computation in Transformerswith Latent Tokens

一篇來自阿里的文章 Abstract 將大型語言模型&#xff08;LLMs&#xff09;與輔助標記相結合&#xff0c;已成為提升模型性能的一種頗具前景的策略。在本研究中&#xff0c;我們提出了一種輕量級方法——“潛在標記”&#xff08;latent tokens&#xff09;。這些虛擬標記在自然…

【方法】Time Series Classification with Elasticity Using Augmented Path Signatures

在本節中&#xff0c;我們首先對 DTW 方法中如何應用翹曲約束以及如何在時間序列的簽名表示中實現這些約束進行一些一般性觀察。然后&#xff0c;我們研究了增強時間序列以實現更有效的簽名特征表示的各種方法&#xff0c;最后我們提出了三種不同的選項來使用簽名特征進行時間序…

數據跨越信任邊界及修復方案

理解“數據跨越信任邊界”問題及制定修復方案至關重要&#xff0c;這直接關系到數據安全、隱私合規和業務風險。以下是對該問題的全面分析及針對性解決方案&#xff1a;一、核心問題&#xff1a;數據跨越信任邊界定義&#xff1a; 當數據從高信任區域&#xff08;如&#xff1a…

Android Coil 3 data加載圖的Bitmap或ByteArray數據類型,Kotlin

Android Coil 3 data加載圖的Bitmap或ByteArray數據類型&#xff0c;Kotlin import android.graphics.Bitmap import android.graphics.BitmapFactory import android.os.Bundle import android.util.Log import android.widget.ImageView import androidx.appcompat.app.AppCo…

云原生技術與應用-Docker高級管理--Dockerfile鏡像制作

目錄 一.Docker鏡像管理 1.Docker鏡像結構 2.Dockerfile介紹 二.Dockerfile實施 1.構建nginx容器 2.構建Tomcat容器 3.構建mysql容器 三.Dockerfile語法注意事項 1.指令書寫范圍 2.基礎鏡像選擇 3.文件操作注意 4.執行命令要點 5.環境變量和參數設置 6.緩存利用與清理 一.Do…

澎湃系統webview加載h5彈窗顯示異常

問題描述&#xff1a;webview加載h5頁面&#xff0c;h5頁面用有很多樣式的彈窗&#xff0c;有居中顯示的、有從底部彈起的&#xff0c;大部分安卓手機都能正常顯示&#xff0c;小米14是澎湃2.0系統&#xff0c;彈窗可以出來、但是被壓扁了、顯示不全。解決方案&#xff1a;?聲…

Java連接Emqx實現訂閱發布消息

一&#xff1a;前提 安裝了Emqx開源版、MQTTX客戶端 二&#xff1a;訂閱發布實現步驟 1.引入依賴 <!--MQTT客戶端--> <dependency><groupId>org.eclipse.paho</groupId><artifactId>org.eclipse.paho.client.mqttv3</artifactId><v…

ReactNative【實戰系列教程】我的小紅書 7 -- 消息(含彈窗菜單,右上角角標,空白頁等)

最終效果彈窗菜單 點擊右上角群聊按鈕后&#xff0c;彈窗菜單無消息代碼實現app/(tabs)/message.tsx import icon_no_collection from "/assets/icons/icon_no_collection.webp"; import FloatMenu, {FloatMenuRef, } from "/modules/message/components/FloatM…

Jenkins詳細教程 - 從入門到精通

目錄 1. 什么是Jenkins 1.1 簡單理解 1.2 技術定義 1.3 核心特點 2. 為什么需要Jenkins 2.1 傳統開發的痛點 手工發布的問題 真實場景舉例 2.2 Jenkins的解決方案 自動化CI/CD流程 3. 核心概念解析 3.1 Job(任務) Job示例 3.2 Build(構建) 3.3 Pipeline(流水…

bash 判斷 /opt/wslibs-cuda11.8 是否為軟連接, 如果是,獲取連接目的目錄并自動創建

以下是實現該功能的 Bash 腳本&#xff1a; bash #!/bin/bash LINK_PATH“/opt/wslibs-cuda11.8” 檢查是否為軟鏈接 if [ -L "KaTeX parse error: Expected EOF, got # at position 24: …H" ]; then#? 獲取軟鏈接的絕對目標路徑…(readlink -f “$LINK_PATH”) # …

【性能測試】jmeter+Linux環境部署和分布式壓測,一篇打通...

目錄&#xff1a;導讀 前言一、Python編程入門到精通二、接口自動化項目實戰三、Web自動化項目實戰四、App自動化項目實戰五、一線大廠簡歷六、測試開發DevOps體系七、常用自動化測試工具八、JMeter性能測試九、總結&#xff08;尾部小驚喜&#xff09; 前言 1、linux獲取動態…

Java 17 新特性筆記

Java 17 是一個 長期支持版本&#xff08;LTS&#xff09;&#xff0c;于 2021 年 9 月發布&#xff0c;是繼 Java 11 之后的重要里程碑。它整合了 Java 12~16 的眾多特性&#xff0c;并引入新的語言增強、JDK API 改進、性能優化和安全增強。 Java 17 版本信息 發布時間&…

WWDC 25 風云再起:SwiftUI 7 Charts 心法從 2D 到 3D 的華麗蛻變

概述 在 iOS 開發這個波譎云詭的江湖中&#xff0c;SwiftUI 可謂是一位后起之秀&#xff0c;以其簡潔明快的招式迅速在 UI 框架領域中嶄露頭角。 而其中的 Charts 框架&#xff0c;更是如同江湖中的 “數據可視化寶典”那樣&#xff0c;讓各位禿頭少俠們能夠輕松將復雜的數據轉…

Vue+Element Plus 中按回車刷新頁面問題排查與解決

VueElement Plus 中按回車刷新頁面問題排查與解決原因分析解決方案方法一&#xff1a;阻止默認行為 submit.prevent方法二&#xff1a;只監聽回車并觸發搜索最終推薦寫法如下&#xff1a;在使用 Vue 3 Element Plus 開發后臺系統時&#xff0c;我們常常會通過 搭配 實現搜索功…

x86匯編語言入門基礎(三)匯編指令篇3 位移運算

位移運算指令&#xff1a;SHL邏輯移位&#xff0c;SAR算術移位&#xff0c; ROR循環右移 1. SHL 邏輯移位 Shift Left, SHL代表向左移位&#xff0c;SHR代表向右移位 指令格式&#xff1a;shl op1, op2 目的操作數 op1&#xff1a;寄存器/內存地址源操作數 op2&#xff1a;寄…

Java-69 深入淺出 RPC 單體架構 垂直架構 分布式架構 微服務架構

點一下關注吧&#xff01;&#xff01;&#xff01;非常感謝&#xff01;&#xff01;持續更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持續更新中&#xff01;&#xff08;長期更新&#xff09; AI煉丹日志-29 - 字節跳動 DeerFlow 深度研究框斜體樣式架 私有…

Android 如何阻止應用自升級

問題背景 1.打開PlayStore,然后登陸賬戶 2.退出應用過幾分鐘后,應用會自動更新到新版本 3.再次打開應用,問題即可復現 一聯網進入playStore應用并且登錄谷歌賬號,退出幾分鐘,在進入,發現應用版本號更新了,應用進行了自我升級,關鍵是升級之后谷歌商店就用不了了,就…