SpockMockStatic方法

SpockMockStatic方法

參考: https://blog.csdn.net/knighttools/article/details/44630975

?

static方法

import com.meituan.mafka.client.producer.IProducerProcessor;
import com.meituan.mdp.langmodel.api.message.AssistantMessage;
import com.sankuai.gaigc.arrange.common.core.promptflow.entity.aigc.flow.cost.collect.AigcFlowCostCollect;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;import java.util.Optional;/*** 計算費用flow調用model產生的資費實體*/
@Slf4j
public class SendCalculateFlowCostMQMessage {private IProducerProcessor aigcFlowCostCollectRecordProducer;public SendCalculateFlowCostMQMessage(IProducerProcessor aigcFlowCostCollectRecordProducer) {this.aigcFlowCostCollectRecordProducer = aigcFlowCostCollectRecordProducer;}//mock 這個靜態方法.public static SendCalculateFlowCostMQMessage create(IProducerProcessor aigcFlowCostCollectRecordProducer) {return new SendCalculateFlowCostMQMessage(aigcFlowCostCollectRecordProducer);}/*** 發送計算費用的MQ消息。*/public void send(String flowId, String appId, String modelName, AssistantMessage assistantMessage) {//...  //內部方法....AigcFlowCostCollect aigcFlowCostCollect = AigcFlowCostCollect.create(xxx,xxx,xxx  );aigcFlowCostCollect.sendMsg(aigcFlowCostCollectRecordProducer);//...}

?

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.dianping.cat.Cat;
import com.meituan.mafka.client.producer.IProducerProcessor;
import com.meituan.mafka.client.producer.ProducerResult;
import com.meituan.mafka.client.producer.ProducerStatus;
import com.sankuai.gaigc.arrange.common.util.RetryUtils;
import com.sankuai.gaigc.arrange.dao.dal.entity.AigcFlowCostCollectRecordDO;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils;
import java.util.Objects;/*** flow計費實體*/
@Slf4j
public class AigcFlowCostCollect {public ProducerResult sendMsg(IProducerProcessor producerProcessor) {// 重試3次return RetryUtils.withRetry(() -> doSendMsg(producerProcessor), 3);}private ProducerResult doSendMsg(IProducerProcessor producerProcessor) {try {String jsonString = JSONObject.toJSONString(this);// mock 這兒的方法...ProducerResult producerResult = producerProcessor.sendMessage(jsonString);return producerResult;} catch (Exception e) {throw new RuntimeException("記錄flow費用異常");}}
}

spock-PowerMockito

?

注意事項.

測試類上打 @RunWith(PowerMockRunner.class)
@PowerMockRunnerDelegate(Sputnik.class) 這兩個注解

然后測試類上打@PrepareForTest(SendCalculateFlowCostMQMessage.class) , 其中SendCalculateFlowCostMQMessage就是你要mock的靜態方法所在的類


import org.assertj.core.util.Lists
import org.junit.runner.RunWith
import org.mockito.Mockito
import org.powermock.api.mockito.PowerMockito
import org.powermock.core.classloader.annotations.PowerMockIgnore
import org.powermock.core.classloader.annotations.PrepareForTest
import org.powermock.modules.junit4.PowerMockRunner
import org.powermock.modules.junit4.PowerMockRunnerDelegate
import org.spockframework.runtime.Sputnik
import spock.lang.Specification
import spock.lang.Unroll@RunWith(PowerMockRunner.class)
@PowerMockRunnerDelegate(Sputnik.class)
@PrepareForTest(SendCalculateFlowCostMQMessage.class)
@PowerMockIgnore("javax.net.ssl.*")
class FunctionCallingSpec extends Specification {FunctionCalling functionCallingIProducerProcessor aigcFlowCostCollectRecordProducerMock = Mock(IProducerProcessor)def setup() {functionCalling = new FunctionCalling()functionCalling.aigcFlowCostCollectRecordProducer = aigcFlowCostCollectRecordProducerMock}/***對SendCalculateFlowCostMQMessage.create靜態方法進行mock* */@Unrolldef "test execute with flow"() {given:PowerMockito.mockStatic(SendCalculateFlowCostMQMessage.class)SendCalculateFlowCostMQMessage create = SendCalculateFlowCostMQMessage.create(aigcFlowCostCollectRecordProducerMock)PowerMockito.when(SendCalculateFlowCostMQMessage.create(Mockito.any(IProducerProcessor.class))).thenReturn(create);//mock方法aigcFlowCostCollectRecordProducerMock.sendMessage(_) >> new ProducerResult(ProducerStatus.SEND_OK)when:Map<String, Object> result = functionCalling.execute()then:result.size() > 0}}

?

可以發現mock成功了.

?image?

?

原理

PowerMock簡單實現原理

  • 當某個測試方法被注解@PrepareForTest標注以后,在運行測試用例時,會創建一個新的org.powermock.core.classloader.MockClassLoader實例,然后加載該測試用例使用到的類(系統類除外)

  • PowerMock會根據你的mock要求,去修改寫在注解@PrepareForTest里的class文件(當前測試類會自動加入注解中),以滿足特殊的mock需求。例如:去除final方法的final標識,在靜態方法的最前面加入自己的虛擬實現等。

  • 如果需要mock的是系統類的final方法和靜態方法,PowerMock不會直接修改系統類的class文件,而是修改調用系統類的class文件,以滿足mock需求。

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

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

相關文章

文件批量重命名001到100如何操作?這幾個文件改名小技巧學起來

文件批量重命名001到100怎么操作&#xff1f;作為打工一族&#xff0c;每天都需要跟很多文件打交道&#xff0c;有時文件太多了&#xff0c;查找起來像是大海撈針&#xff0c;特別是圖片文件。這個時候我們就需要對大量文件進行整理和排序&#xff0c;這樣有助于提高我們的工作…

微信小程序 自定義 tabBar

自定義 tabBar | 微信開放文檔 本文案例使用的Taro 非原生微信小程序 使用流程 1. 配置信息 在 app.json 中的 tabBar 項指定 custom 字段&#xff0c;同時其余 tabBar 相關配置也補充完整。所有 tab 頁的 json 里需聲明 usingComponents 項&#xff0c;也可以在 app.json 全局…

Java語言的應用場景

1、開發移動應用程序 例如&#xff1a;Android。 2、開發服務應用程序&#xff0c;搭建WEB界面。 例如&#xff1a;Servlet、JSP。 3、開發應用服務器。 例如Tomcat。 4、開發網絡通信程序。 5、開發圖形化界面桌面端。 Java支持用AWT、Swing、JavaFX三種包來開發圖形化界面…

電腦提示缺少vcruntime140_1.dll的解決方法,總結7種有效方法

vcruntime140_1.dll是Microsoft Visual C 2015運行時庫的一部分&#xff0c;它為使用Visual Studio 2015開發的應用程序提供了必要的運行時組件。該文件支持C程序的執行&#xff0c;包括內存管理、輸入輸出操作以及多線程功能等。缺失或損壞此文件可能導致應用程序無法啟動或運…

廣告聯盟四大家

國內四大廣告承接商&#xff1a;①抖音旗下-穿山甲②快手旗下-快手聯盟③百度旗下-百青藤④騰訊旗下-優量匯 我們目前在互聯網上能看到的所有廣告都是由他們發放的&#xff0c;在其中我們打小游戲復活看廣告&#xff0c;獲得道具看廣告&#xff0c;看劇看廣告&#xff0c;這…

數據庫的隔離級別和索引使用

先看一下隔離級別&#xff0c; 隔離級別首先要明確 &#xff0c;隔離的越重&#xff0c;那么自然會失去效率&#xff0c;為什么有這么多的隔離級別&#xff0c;其實就是平衡業務關系盡可能的提高效率。 下面看下隔離級別和介紹&#xff1a; 讀未提交是指&#xff1a;一個事務…

Oracle SQL詳解

Oracle SQL是一種用于管理和操作Oracle數據庫的編程語言。以下是一些基本的Oracle SQL語法和建表建用戶的詳解。 創建用戶 在Oracle中&#xff0c;創建用戶通常需要具有足夠權限的用戶&#xff08;通常是具有DBA角色的用戶&#xff09;。以下是一個創建用戶的例子&#xff1a;…

基于詞頻統計的聚類算法(kmeans)

基于詞頻統計的聚類算法&#xff08;kmeans&#xff09; 數據集是三個政府報告文件&#xff0c;這里就不做詳細描述了&#xff0c;就是簡單的txt文件。 實驗過程主要分為如下幾步&#xff1a; 1.讀取數據并進行停用詞過濾 2.統計詞頻 3.基于三篇文章詞頻統計的層次聚類 4.基于…

廢品回收小程序怎么做?有哪些核心功能?

廢品回收行業正逐步走向高質量發展的道路。在國家政策的推動下&#xff0c;再生資源市場需求旺盛&#xff0c;行業內部競爭格局逐漸明朗。 隨著互聯網技術的發展&#xff0c;"互聯網回收"成為廢品回收行業的一個新趨勢。通過微信小程序這種線上平臺&#xff0c;用戶…

數據可視化在智慧園區中的核心價值解析

數據可視化在智慧園區中發揮著至關重要的價值。智慧園區是一種基于物聯網、大數據、云計算等先進技術的現代化管理模式&#xff0c;旨在通過智能化手段提升園區的管理效率、服務水平和用戶體驗。而數據可視化作為數據處理和展示的重要工具&#xff0c;正是智慧園區實現這些目標…

BUG: VS Code C++輸出中文亂碼

BUG: VS Code C輸出中文亂碼 環境 Windows 11 VS Code 編輯器詳情 在Windows 使用 cout 函數輸出中文時出現亂碼 問題的原因在cmd的顯示編碼和c程序編碼的不同。cmd默認的是gbk編碼&#xff0c;而VS Code 軟件的CMD終端默認是utf-8編碼&#xff0c;因而在輸出中文文本時會出…

Flutter 中的 SliverCrossAxisExpanded 小部件:全面指南

Flutter 中的 SliverCrossAxisExpanded 小部件&#xff1a;全面指南 Flutter 是一個由 Google 開發的跨平臺 UI 框架&#xff0c;它允許開發者使用 Dart 語言來構建高性能、美觀的移動、Web 和桌面應用。在 Flutter 的豐富組件庫中&#xff0c;SliverCrossAxisExpanded 是一個…

Ubuntu server 24 安裝配置 snort3 3.2.1.0 網絡入侵檢測防御系統 配置注冊規則集

一 下載并安裝源代碼 地址:https://github.com/snort3/snort3/releases #下載&#xff0c;解壓 wget https://github.com/snort3/snort3/archive/refs/tags/3.2.1.0.tar.gz tar zxvf 3.2.1.0.tar.gz 二 安裝軟件依賴包 1 安裝依賴包 sudo apt update sudo apt install…

Bytebase 2.18.0 - 支持創建用戶組

&#x1f680; 新功能 支持創建用戶組。支持 BigQuery。支持 SQL Server 庫表同步。支持 MongoDB 集群并支持直接連接到集群中的節點。支持 SQL Server 和 Oracle 顯示工單任務執行日志&#xff0c;如影響行數或錯誤。添加 SQL 審核規則: 禁止在 SQL Server 中進行跨庫查詢。禁…

代碼隨想錄算法訓練營第四十四天 | 01背包問題 二維、 01背包問題 一維、416. 分割等和子集

01背包問題 二維 代碼隨想錄 視頻講解&#xff1a;帶你學透0-1背包問題&#xff01;| 關于背包問題&#xff0c;你不清楚的地方&#xff0c;這里都講了&#xff01;| 動態規劃經典問題 | 數據結構與算法_嗶哩嗶哩_bilibili 1.dp數組定義 dp[i][j] 下標為[0,i]之間的物品&…

【C#】類和對象的區別

1.區別概述 結構體和類的最大區別是在存儲空間上&#xff0c;前者是值類型&#xff0c;后者是引用類型&#xff0c;它們在賦值上有很大的區別&#xff0c;在類中指向同一塊空間的兩個類的值會隨一個類的改變而改變另一個&#xff0c;請看如下代碼所示&#xff1a; namespace …

【漯河市人才交流中心_登錄安全分析報告-Ajax泄漏滑動距離導致安全隱患】

前言 由于網站注冊入口容易被黑客攻擊&#xff0c;存在如下安全問題&#xff1a; 暴力破解密碼&#xff0c;造成用戶信息泄露短信盜刷的安全問題&#xff0c;影響業務及導致用戶投訴帶來經濟損失&#xff0c;尤其是后付費客戶&#xff0c;風險巨大&#xff0c;造成虧損無底洞…

JavaSE:異常

1、什么是異常 在生活當中&#xff0c;不管是人還是動物又或是植物&#xff0c;都會生病&#xff1b;在程序中也是&#xff0c;作為程序猿&#xff0c;雖然我們會盡力將程序寫的完美&#xff0c;可難免會出現一些問題~ 在程序執行過程中&#xff0c;發生的一些不正常行為&…

Windows系統安裝openvino(2024.1.0)

一、openvino下載&#xff1a; 下載地址&#xff1a;下載英特爾發行版 OpenVINO 工具套件 (intel.cn) 下載完之后將壓縮包解壓&#xff0c;然后重命名文件夾為openvino_2024.1.0。 二、環境配置 以python環境為例&#xff1a;&#xff08;建議使用moniconda虛擬環境來安裝&am…

Android 圖表開發開源庫 MPAndroidChart 使用總結

1. 引言 電視項目中需要一個折線圖表示節電數據變化情況&#xff0c;類比 H5 來說&#xff0c;Android 中也應該有比較成熟的控件&#xff0c;經過調研后&#xff0c;發現 MPAndroidChart 功能比較強大&#xff0c;網上也有人說可能是目前 Android 開發最好用的一個三方庫了&a…