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

PowerMockito的基本使用解析

 更新時(shí)間:2021年07月14日 15:28:15   作者:天空源  
這篇文章主要介紹了PowerMockito的基本使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

PowerMockito經(jīng)常會(huì)結(jié)合Mockito使用,先說(shuō)一下這2個(gè)的介紹:

1.Mockito和PowerMockito的簡(jiǎn)介

Mockito和PowerMockito是什么東西呢?他們有什么作用呢?

Mocktio和PowerMockito都是Mock的工具類,主要是Java的類庫(kù),Mock就是偽裝的意思。

他們適用于單元測(cè)試中,對(duì)于單元測(cè)試來(lái)說(shuō),我們不希望依賴于第三方的組件,比如數(shù)據(jù)庫(kù)、Webservice等。在寫(xiě)單元測(cè)試的時(shí)候,我們?nèi)绻龅搅诉@些需要依賴第三方的情況,我們可以使用Mock的技術(shù),偽造出來(lái)我們自己想要的結(jié)果。

對(duì)于Java而言,mock的對(duì)象主要是Java 方法和 Java類。

下面我就介紹一下怎么使用Mockito和PowerMockito去進(jìn)行Mock。

2.Mockito和PowerMockito的區(qū)別

在我看來(lái),PowerMockito是Mockito的一種增強(qiáng),他們的PowerMockito可以調(diào)用Mockito的方法,但是對(duì)于Mocktio不能Mock的對(duì)象或者方法,我們可以使用PowerMockito來(lái)實(shí)現(xiàn)。

比如Mockito不能用于static Method, final method, 枚舉類, private method,這些我們都可以用PowerMockito來(lái)實(shí)現(xiàn),當(dāng)PowerMockito和mockito結(jié)合使用的時(shí)候,我們需要考慮兼容性的問(wèn)題。

兩者的版本需要兼容

Mockito PowerMockito
2.8.9+ 2.x
2.8.0-2.8.9 1.7.x
2.7.5 1.7.0RC4
2.4.0 1.7.0RC2
2.0.0-beta - 2.0.42-beta 1.6.5-1.7.0RC
1.10.8 - 1.10.x 1.6.2 - 2.0
1.9.5-rc1 - 1.9.5 1.5.0 - 1.5.6
1.9.0-rc1 & 1.9.0 1.4.10 - 1.4.12
1.8.5 1.3.9 - 1.4.9
1.8.4 1.3.7 & 1.3.8
1.8.3 1.3.6
1.8.1 & 1.8.2 1.3.5
1.8 1.3
1.7 1.2.5

Ref:https://github.com/powermock/powermock/wiki/Mockito

3.具體用法

本文實(shí)現(xiàn)實(shí)現(xiàn)需要構(gòu)造的接口和需要返回值的接口

引入依賴

<dependencies>
	<dependency>
		<groupId>org.projectlombok</groupId>
		<artifactId>lombok</artifactId>
	</dependency>
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-context-support</artifactId>
	</dependency>
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-test</artifactId>
		<scope>test</scope>
	</dependency>
	<dependency>
		<groupId>junit</groupId>
		<artifactId>junit</artifactId>
		<version>4.12</version>
		<scope>test</scope>
	</dependency>
	<dependency>
		<groupId>org.mockito</groupId>
		<artifactId>mockito-all</artifactId>
		<version>2.0.2-beta</version>
		<scope>test</scope>
	</dependency>
	<dependency>
		<groupId>org.powermock</groupId>
		<artifactId>powermock-module-junit4</artifactId>
		<version>1.7.4</version>
		<scope>test</scope>
	</dependency>
	<dependency>
		<groupId>org.powermock</groupId>
		<artifactId>powermock-api-mockito</artifactId>
		<version>1.7.4</version>
		<scope>test</scope>
	</dependency>
</dependencies>

需要Mock的類:

ProcessDB.java

package com.github.mock.simple.vo; 
public class ProcessDB {    
    public ProcessDB(String ss){
        System.out.println(ss + " Enter ProcessDB ...");
    }
    
    public ProcessDB(){
        System.out.println("Enter ProcessDB ...");
    }
    
    public void getResultOfConnectDBNoReturn(String ss) {
        System.out.println(ss + " Enter getResultOfConnectDBNoReturn ...");
    }
    
    public String getResultOfConnectDB() {
        return "haha, Really went to the database";
    }
}
 

需要測(cè)試的類:

IUserService.java

package com.github.mock.simple.user; 
public interface IUserService { 
    public String testedMehtod(); 
}

UserServiceImpl.java

package com.github.mock.simple.user.impl; 
import org.springframework.stereotype.Service; 
import com.github.mock.simple.user.IUserService;
import com.github.mock.simple.vo.ProcessDB;
 
@Service
public class UserServiceImpl implements IUserService {
 
    @Override
    public String testedMehtod(){
        System.out.println("Enter UserServiceImpl testedMehtod ...");
        ProcessDB processDB = new ProcessDB("BB");
        processDB.getResultOfConnectDBNoReturn("AA");
        return processDB.getResultOfConnectDB();
    } 
}

BussinessService.java

package com.github.mock.simple.user.impl; 
import com.github.mock.simple.vo.ProcessDB; 
public class BussinessService {
    public String testedMehtod() {
        System.out.println("Enter BussinessService testedMehtod ...");
        ProcessDB processDB = new ProcessDB("BB");
        processDB.getResultOfConnectDBNoReturn("AA");
        return processDB.getResultOfConnectDB();
    }
}

測(cè)試類:

MockSpringSimpleTest.java

package com.github.mock.simple.test; 
import java.text.MessageFormat; 
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import org.powermock.modules.junit4.PowerMockRunnerDelegate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
 
import com.github.mock.simple.user.IUserService;
import com.github.mock.simple.user.impl.BussinessService;
import com.github.mock.simple.user.impl.UserServiceImpl;
import com.github.mock.simple.vo.ProcessDB;
 
@RunWith(PowerMockRunner.class)
@PowerMockRunnerDelegate(SpringJUnit4ClassRunner.class)//Spring上下文
@PrepareForTest({BussinessService.class,UserServiceImpl.class})
@ContextConfiguration(locations = {"classpath:applicationContext-mock-inject.xml"})
public class MockSpringSimpleTest {
 
    //使用Spring上下文
    @Autowired
    IUserService userService;
 
    @Mock
    ProcessDB processDB;
    
    //不使用Spring上下文時(shí),使用該注解
    @InjectMocks
    private BussinessService bussinessService;
 
    @Before
    public void initMocks() throws Exception {
        MockitoAnnotations.initMocks(this);
        //ReflectionTestUtils.setField(userService, "processDB", processDB);
        PowerMockito.whenNew(ProcessDB.class).withArguments("BB").thenReturn(processDB);
        // PowerMockito.whenNew(ProcessDB.class).withNoArguments().thenReturn(processDB);
    }
 
    @Test
    public void mockConnectDB() {
        String aa = "haha, everything is fake"; 
        PowerMockito.when(processDB.getResultOfConnectDB()).thenReturn(aa);
        PowerMockito.doNothing().when(processDB).getResultOfConnectDBNoReturn("AA");
        System.out.println(bussinessService.testedMehtod());
        Assert.assertEquals("haha, everything is fake", bussinessService.testedMehtod());
    }
 
    @Test
    public void mockConnectDB2() {
        try {
            String aa = "haha, everything is fake";
            PowerMockito.when(processDB.getResultOfConnectDB()).thenReturn(aa);
            PowerMockito.doNothing().when(processDB).getResultOfConnectDBNoReturn("AA");
            System.out.println(userService.testedMehtod());
            Assert.assertEquals("haha, everything is fake", userService.testedMehtod());
        } catch (Exception ex) {
            System.out.println("--- getMessage ---");
            System.out.println(ex.getMessage());
            System.out.println();
            
            System.out.println("--- toString ---");
            System.out.println(ex.toString());
            System.out.println();
            
//            System.out.println("--- printStackTrace ---");
//            StringWriter stringWriter = new StringWriter();
//            PrintWriter printWriter = new PrintWriter(stringWriter);
//            ex.printStackTrace(printWriter);
//            System.out.println(stringWriter.toString());
//            System.out.println();
            
            System.out.println("--- printStackTrace DIY ---");
            System.out.println(ex.getClass().getName() + ": " + ex.getMessage());
            StringBuilder sbException = new StringBuilder();
            for (StackTraceElement ele : ex.getStackTrace()) {
                sbException.append(MessageFormat.format("\tat {0}.{1}({2}:{3})\n", 
                    ele.getClassName(), ele.getMethodName(), ele.getFileName(), ele.getLineNumber()));;
            }
            System.out.println(sbException);            
            sbException = null;
//            stringWriter = null;
//            printWriter = null;
        }
    } 
}

掃描注入xml

最后applicationContext-mock-inject.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="
 http://www.springframework.org/schema/beans
 http://www.springframework.org/schema/beans/spring-beans.xsd  
 http://www.springframework.org/schema/context
 http://www.springframework.org/schema/context/spring-context.xsd"> 
    <context:component-scan base-package="com.github.mock.simple"/> 
</beans>

對(duì)于沒(méi)有實(shí)現(xiàn)類,但又被依賴的接口,在applicationContext-mock-inject.xml添加如下內(nèi)容 (本文不需要):

<bean name="iXxService" class="org.mockito.Mockito" factory-method="mock">
    <constructor-arg value="com.github.mock.simple.api.IXxService"/>
</bean>

同時(shí)在測(cè)試類里面添加下面的代碼:

@Mock
iXxService iXxService;

在 @Before里面添加下面的代碼

ReflectionTestUtils.setField(userService, "iXxService", iXxService);

測(cè)試結(jié)果

PowerMockito的使用技巧

當(dāng)IT中有些依賴組件無(wú)法正常集成,需要mock支持測(cè)試,可以使用power mockito。

特別注意:

當(dāng)對(duì)一個(gè)對(duì)象進(jìn)行powermockito,應(yīng)該在prepare方法,統(tǒng)一mock這個(gè)對(duì)象。然后在其他方法,分別進(jìn)行調(diào)用when,否則,多個(gè)方法內(nèi)進(jìn)行mock,會(huì)出錯(cuò)。

比如有個(gè) Service處于IT case的底層,普通的mock根本mock不進(jìn)去,但我們又不能為了集成測(cè)試,為這個(gè)testcase單獨(dú)開(kāi)一個(gè)口子,注入mock對(duì)象。power mockito強(qiáng)大的mock能力在這里可以用上。

比如:

我的mock對(duì)象impalaService它在schmaMessagehandler類里new出來(lái)的,則需要加上注解。

首先在test 類的開(kāi)頭,加上注解頭部,頭部類是mock對(duì)象所在類。

@RunWith(PowerMockRunner.class)
@PrepareForTest({HttpClient.class,SchemaMessageHandler.class})

其次:

PooledImpalaService impalaService = PowerMockito.mock(PooledImpalaService.class);
PowerMockito.whenNew(PooledImpalaService.class).withArguments((ConfigurationanyObject()).thenReturn(impalaService);
doNothing().when(impalaService).createTable(anyString(),(Schema) anyObject());

使用powermockito,注意在用any()參數(shù)時(shí)候,比如

doNothing().when(impalaService).createTable(anyString(),(Schema) anyObject());

參數(shù)列表中,只要一個(gè)使用了any(),any****,則所有參數(shù)都要用any相關(guān)的參數(shù),否則mock不成功。

總的來(lái)說(shuō),在it當(dāng)中,只有你想mock一個(gè)對(duì)象,一定可以,比如你在A類中用到了B類,那么在prepareForTest中增加A類的注解。

如下:

@PrepareForTest({A.class})然后,在it中 聲明一個(gè)B類,B b = PowerMockito.mock(B.class);這時(shí)候,就可以指定b的方法的返回值,或 PowerMockit.doNothing().when(b).方法名(),讓該方法什么也不做。

最后,再講A實(shí)例化。PowerMockit是講究mock設(shè)置順序的。一定要注意。

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

相關(guān)文章

  • java接口自動(dòng)化測(cè)試框架及斷言詳解

    java接口自動(dòng)化測(cè)試框架及斷言詳解

    這篇文章主要介紹了java接口自動(dòng)化測(cè)試框架及斷言詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-07-07
  • mybatis配置mapper-locations位置的三種方式小結(jié)

    mybatis配置mapper-locations位置的三種方式小結(jié)

    這篇文章主要給大家介紹了關(guān)于mybatis配置mapper-locations位置的三種方式,Mybatis-Plus的初衷是為了簡(jiǎn)化開(kāi)發(fā),而不建議開(kāi)發(fā)者自己寫(xiě)SQL語(yǔ)句的,但是有時(shí)客戶需求比較復(fù)雜,需要的朋友可以參考下
    2023-08-08
  • SpringBoot如何配置tomcat access日志

    SpringBoot如何配置tomcat access日志

    access日志記錄了每一個(gè)HTTP請(qǐng)求的信息,包括請(qǐng)求的來(lái)源、請(qǐng)求的資源、響應(yīng)狀態(tài)碼等,常常用來(lái)做數(shù)據(jù)統(tǒng)計(jì)、性能監(jiān)控,比如通過(guò)分析訪問(wèn)日志,可以發(fā)現(xiàn)性能瓶頸和優(yōu)化機(jī)會(huì),提升應(yīng)用的響應(yīng)速度等,這篇文章主要介紹了SpringBoot配置tomcat access日志,需要的朋友可以參考下
    2024-05-05
  • Java爬蟲(chóng)(Jsoup與WebDriver)的使用

    Java爬蟲(chóng)(Jsoup與WebDriver)的使用

    這篇文章主要介紹了Java爬蟲(chóng)(Jsoup與WebDriver)的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • Springboot整合Shiro實(shí)現(xiàn)登錄與權(quán)限校驗(yàn)詳細(xì)解讀

    Springboot整合Shiro實(shí)現(xiàn)登錄與權(quán)限校驗(yàn)詳細(xì)解讀

    本文給大家介紹Springboot整合Shiro的基本使用,Apache?Shiro是Java的一個(gè)安全框架,Shiro本身無(wú)法知道所持有令牌的用戶是否合法,我們將整合Shiro實(shí)現(xiàn)登錄與權(quán)限的驗(yàn)證
    2022-04-04
  • SpringBoot入門實(shí)現(xiàn)第一個(gè)SpringBoot項(xiàng)目

    SpringBoot入門實(shí)現(xiàn)第一個(gè)SpringBoot項(xiàng)目

    今天我們一起來(lái)完成一個(gè)簡(jiǎn)單的SpringBoot(Hello World)。就把他作為你的第一個(gè)SpringBoot項(xiàng)目。具有一定的參考價(jià)值,感興趣的可以了解一下
    2021-09-09
  • 基于Pinpoint對(duì)SpringCloud微服務(wù)項(xiàng)目實(shí)現(xiàn)全鏈路監(jiān)控的問(wèn)題

    基于Pinpoint對(duì)SpringCloud微服務(wù)項(xiàng)目實(shí)現(xiàn)全鏈路監(jiān)控的問(wèn)題

    這篇文章主要介紹了基于Pinpoint對(duì)SpringCloud微服務(wù)項(xiàng)目實(shí)現(xiàn)全鏈路監(jiān)控的問(wèn)題,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-02-02
  • 將Java(SpringBoot)項(xiàng)目打包為Docker鏡像的三種方法

    將Java(SpringBoot)項(xiàng)目打包為Docker鏡像的三種方法

    這篇文章主要介紹了將Java(SpringBoot)項(xiàng)目打包為Docker鏡像的三種方法,分別是手動(dòng)構(gòu)建、使用Dockerfile和使用SpringBootMaven插件,每種方法都有其特點(diǎn)和適用場(chǎng)景,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-03-03
  • Java list利用遍歷進(jìn)行刪除操作3種方法解析

    Java list利用遍歷進(jìn)行刪除操作3種方法解析

    這篇文章主要介紹了Java list利用遍歷進(jìn)行刪除操作3種方法解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-01-01
  • JAVA實(shí)現(xiàn)經(jīng)典游戲坦克大戰(zhàn)的示例代碼

    JAVA實(shí)現(xiàn)經(jīng)典游戲坦克大戰(zhàn)的示例代碼

    小時(shí)候大家都玩過(guò)坦克大戰(zhàn)吧,熟悉的旋律和豐富的關(guān)卡陪伴了我們一整個(gè)寒暑假。本文將通過(guò)Java+Swing實(shí)現(xiàn)這一經(jīng)典游戲,感興趣的可以學(xué)習(xí)一下
    2022-01-01

最新評(píng)論

娄底市| 永泰县| 香河县| 余庆县| 昂仁县| 德惠市| 衡阳县| 望谟县| 司法| 宿迁市| 乡城县| 平利县| 洮南市| 石屏县| 鄂州市| 龙胜| 凌海市| 玉门市| 房山区| 晋江市| 石柱| 武宣县| 丰镇市| 庄浪县| 鄂州市| 平湖市| 贵州省| 罗田县| 长顺县| 芷江| 青川县| 洛浦县| 库车县| 张掖市| 井研县| 大石桥市| 涡阳县| 合山市| 阜康市| 界首市| 滨海县|