最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Mockito如何mock靜態(tài)方法問題

 更新時間:2025年02月25日 10:53:16   作者:cab5  
本文介紹了如何在Mockito 3.4.0版本及以上版本中mock靜態(tài)方法,包括如何在pom文件中添加相關(guān)jar包、如何使用Mockito.mockStatic(Class mockClass)方法以及注意事項等

Mockito如何mock靜態(tài)方法

在實際工作當(dāng)中,我們經(jīng)常會遇到需要對靜態(tài)方法進(jìn)行 mock 的情況。在 mockito 2.x 的時代,我們需要借助 powmock 才能實現(xiàn)。

當(dāng) mockito 進(jìn)化到了 3.4.0 版本以后,也開始對靜態(tài)方法 mock 進(jìn)行了支持(主要是通過 mockito-inline 包)。

簡單的介紹就到這里,下面讓我們進(jìn)入主題吧。

1.首先確保pom文件中

mockito 相關(guān) jar 包的版本(這里我用的版本是 3.7.7),如下:

<dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-core</artifactId>
    <version>3.7.7</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-inline</artifactId>
    <version>3.7.7</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-junit-jupiter</artifactId>
    <version>3.7.7</version>
    <scope>test</scope>
</dependency>
<dependency>
     <groupId>junit</groupId>
     <artifactId>junit</artifactId>
     <version>4.13</version>
     <scope>test</scope>
 </dependency>

2.使用方式

Mockito.mockStatic(Class mockClass),如下:

// 這里 DateUtil 內(nèi)提供了靜態(tài)方法
MockedStatic<DateUtil> dateUtil = mockStatic(DateUtil.class);

示例:

import static org.mockito.Mockito.mockStatic;

@RunWith(MockitoJUnitRunner.class)
public class AlphaServiceTest {

    @Test
    public void testHttp() {
        ...
        
        MockedStatic<HTTPClient> httpClient = mockStatic(HTTPClient.class);
        httpClient.when(() -> HTTPClient.sendPost("xxx/zzz/ccc", "hello")).thenReturn("success");
        
        ...
        
        // 關(guān)閉
        httpClient.close();
    }
    

這樣基本上就 OK 了。

唯一需要注意下的就是 httpClient.close(),這個問題會在「3.其他」中 “錯誤提示 static mocking is already registered in the current thread To create a new mock, the existing static mock registration must be deregistered” 進(jìn)行詳細(xì)說明)

3.其他

如果項目中未引入 mockito-inline,會出現(xiàn)如下錯誤信息:

org.mockito.exceptions.base.MockitoException: 
The used MockMaker SubclassByteBuddyMockMaker does not support the creation of static mocks

Mockito's inline mock maker supports static mocks based on the Instrumentation API.
You can simply enable this mock mode, by placing the 'mockito-inline' artifact where you are currently using 'mockito-core'.
Note that Mockito's inline mock maker is not supported on Android.

    at com.annoroad.order.service.PreOrderServiceTestCase.testSaveClinicalFreeSuccess1(PreOrderServiceTestCase.java:86)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
    at org.springframework.test.context.junit4.statements.RunBeforeTestExecutionCallbacks.evaluate(RunBeforeTestExecutionCallbacks.java:74)
    at org.springframework.test.context.junit4.statements.RunAfterTestExecutionCallbacks.evaluate(RunAfterTestExecutionCallbacks.java:84)
    at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:75)
    at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:86)
    at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:84)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:251)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:97)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
    at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:190)
    at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
    at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:33)
    at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:230)
    at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:58)

錯誤提示

static mocking is already registered in the current thread To create a new mock, the existing static mock registration must be deregistered

當(dāng)多個單元測試都使用了同一個 static mock 對象,且使用完成后都沒有進(jìn)行 close。此時,若這幾個單元測試用一起執(zhí)行,第一個單元測試占用了 static mock 對象,第二個單元測試就沒有辦法再占用了。

如果出現(xiàn)了這種情況,解決辦法也很簡單,就是關(guān)閉 static mock 對象,如下:

import static org.mockito.Mockito.mockStatic;

@RunWith(MockitoJUnitRunner.class)
public class AlphaServiceTest {

    @Test
    public void testHttp1() {
        ...
        
        MockedStatic<HTTPClient> httpClient = mockStatic(HTTPClient.class);
        httpClient.when(() -> HTTPClient.sendPost("xxx/zzz/ccc", "hello")).thenReturn("success");
        
        ...

		httpClient.close();
    }
    
    @Test
    public void testHttp2() {
        ...
        
        MockedStatic<HTTPClient> httpClient = mockStatic(HTTPClient.class);
        httpClient.when(() -> HTTPClient.sendPost("xxx/zzz/ccc", "hello")).thenReturn("success");
        
        ...

		httpClient.close();
    }
    
    @Test
    public void testHttp3() {
        ...
        
        MockedStatic<HTTPClient> httpClient = mockStatic(HTTPClient.class);
        httpClient.when(() -> HTTPClient.sendPost("xxx/zzz/ccc", "hello")).thenReturn("success");
        
        ...
		
		httpClient.close();
    }

如果你的很多單元測試中都用到了 mockStatic(HTTPClient.class),且覺得在每個單元測試當(dāng)中都寫一遍 mockStatic()…close() 很低效,可以采用下邊的方式:

import static org.mockito.Mockito.mockStatic;

@RunWith(MockitoJUnitRunner.class)
public class AlphaServiceTest {
	private MockedStatic<HttpClietn> httpClient;

	// 每個單元測試啟動前,先執(zhí)行該方法(高版本中 @Before 被替換成 @BeforeEach)
    @Before
    public void setUp() {
        this.httpClient = mockStatic(HTTPClient.class);
    }
    
	// 每個單元測試執(zhí)行完成后,執(zhí)行該方法(高版本中 @After 被替換成 @AfterEach)
    @After
    public void teardown() {
        this.httpClient.close();
    }

    @Test
    public void testHttp1() {
        ...
        
        httpClient.when(() -> HTTPClient.sendPost("xxx/zzz/ccc", "hello")).thenReturn("success");
        
        ...
    }
    
    @Test
    public void testHttp2() {
        ...
        
        httpClient.when(() -> HTTPClient.sendPost("xxx/zzz/ccc", "hello")).thenReturn("success");
        
        ...
    }
    
    @Test
    public void testHttp3() {
        ...
        
        httpClient.when(() -> HTTPClient.sendPost("xxx/zzz/ccc", "hello")).thenReturn("success");
        
        ...
    }

這樣就清爽多了 ~:)

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 深入了解JVM(Java虛擬機)內(nèi)存結(jié)構(gòu)

    深入了解JVM(Java虛擬機)內(nèi)存結(jié)構(gòu)

    Java虛擬機(Java Virtual Machine,JVM)是Java程序的運行環(huán)境,它是一個抽象的計算機模型,通過解釋和執(zhí)行Java字節(jié)碼來運行Java程序,本將大家深入了解JVM(Java虛擬機)內(nèi)存結(jié)構(gòu),需要的朋友可以參考下
    2023-08-08
  • Tomcat調(diào)優(yōu)詳解

    Tomcat調(diào)優(yōu)詳解

    這篇文章主要介紹了Tomcat調(diào)優(yōu)方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • 詳解lambda表達(dá)式foreach性能分析

    詳解lambda表達(dá)式foreach性能分析

    這篇文章主要介紹了詳解lambda表達(dá)式foreach性能分析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • java基礎(chǔ)中異常及包歸納整理

    java基礎(chǔ)中異常及包歸納整理

    這篇文章主要介紹了java基礎(chǔ)中的 異常與包,有需要的朋友可以參考一下
    2017-04-04
  • Linux系統(tǒng)下安裝和卸載JDK8的方式

    Linux系統(tǒng)下安裝和卸載JDK8的方式

    這篇文章主要介紹了Linux安裝和卸載JDK8,第一種是使用yum命令一鍵安裝,默認(rèn)安裝目錄在/usr/lib/jvm第二種是手動安裝,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-09-09
  • springboot部署linux訪問服務(wù)器資源的方法

    springboot部署linux訪問服務(wù)器資源的方法

    這篇文章主要介紹了springboot部署linux訪問服務(wù)器資源,部署springboot項目至服務(wù)器用了幾種不同方法,文中給大家詳細(xì)介紹,需要的朋友可以參考下
    2019-12-12
  • 聊聊spring boot的WebFluxTagsProvider的使用

    聊聊spring boot的WebFluxTagsProvider的使用

    這篇文章主要介紹了聊聊spring boot的WebFluxTagsProvider的使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • SpringMVC?RESTFul實體類創(chuàng)建及環(huán)境搭建

    SpringMVC?RESTFul實體類創(chuàng)建及環(huán)境搭建

    這篇文章主要為大家介紹了SpringMVC?RESTFul實體類創(chuàng)建及環(huán)境搭建詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • Java編程中的vector類用法學(xué)習(xí)筆記

    Java編程中的vector類用法學(xué)習(xí)筆記

    Vector通常被用來實現(xiàn)動態(tài)數(shù)組,即可實現(xiàn)自動增長的對象數(shù)組,和C++一樣vector類同樣被Java內(nèi)置,下面就來看一下vector類的基本用法.
    2016-05-05
  • RocketMQ NameServer 核心源碼解析

    RocketMQ NameServer 核心源碼解析

    這篇文章主要為大家介紹了RocketMQ NameServer 核心源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09

最新評論

东乡| 息烽县| 大悟县| 乌拉特后旗| 和田县| 拉孜县| 和平区| 进贤县| 金华市| 农安县| 和硕县| 武隆县| 长汀县| 深水埗区| 天津市| 嵩明县| 宜州市| 长垣县| 额济纳旗| 离岛区| 巴塘县| 苏尼特左旗| 舒兰市| 祁东县| 运城市| 莒南县| 图片| 罗田县| 察隅县| 平塘县| 克山县| 凤冈县| 乌鲁木齐县| 张家港市| 仁怀市| 平山县| 庆安县| 福鼎市| 菏泽市| 桑日县| 西乌珠穆沁旗|