iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >PowerMockito的基本使用解析
  • 651
分享到

PowerMockito的基本使用解析

2024-04-02 19:04:59 651人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

PowerMockito经常会结合Mockito使用,先说一下这2个的介绍: 1.Mockito和PowerMockito的简介 Mockito和PowerMockito是什么东西呢

PowerMockito经常会结合Mockito使用,先说一下这2个的介绍:

1.Mockito和PowerMockito的简介

Mockito和PowerMockito是什么东西呢?他们有什么作用呢?

Mocktio和PowerMockito都是Mock的工具类,主要是Java的类库,Mock就是伪装的意思。

他们适用于单元测试中,对于单元测试来说,我们不希望依赖于第三方的组件,比如数据库WEBservice等。在写单元测试的时候,我们如果遇到了这些需要依赖第三方的情况,我们可以使用Mock的技术,伪造出来我们自己想要的结果。

对于Java而言,mock的对象主要是Java 方法和 Java类。

下面我就介绍一下怎么使用Mockito和PowerMockito去进行Mock。

2.Mockito和PowerMockito的区别

在我看来,PowerMockito是Mockito的一种增强,他们的PowerMockito可以调用Mockito的方法,但是对于Mocktio不能Mock的对象或者方法,我们可以使用PowerMockito来实现。

比如Mockito不能用于static Method, final method, 枚举类, private method,这些我们都可以用PowerMockito来实现,当PowerMockito和mockito结合使用的时候,我们需要考虑兼容性的问题。

两者的版本需要兼容

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.具体用法

本文实现实现需要构造的接口和需要返回值的接口

引入依赖


<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";
    }
}
 

需要测试的类:

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();
    }
}

测试类:

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上下文时,使用该注解
    @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>

对于没有实现类,但又被依赖的接口,在applicationContext-mock-inject.xml添加如下内容 (本文不需要):


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

同时在测试类里面添加下面的代码:


@Mock
iXxService iXxService;

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


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

测试结果

PowerMockito的使用技巧

当IT中有些依赖组件无法正常集成,需要mock支持测试,可以使用power mockito。

特别注意:

当对一个对象进行powermockito,应该在prepare方法,统一mock这个对象。然后在其他方法,分别进行调用when,否则,多个方法内进行mock,会出错。

比如有个 Service处于IT case的底层,普通的mock根本mock不进去,但我们又不能为了集成测试,为这个testcase单独开一个口子,注入mock对象。power mockito强大的mock能力在这里可以用上。

比如:

我的mock对象impalaService它在schmaMessagehandler类里new出来的,则需要加上注解。

首先在test 类的开头,加上注解头部,头部类是mock对象所在类。


@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()参数时候,比如


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

参数列表中,只要一个使用了any(),any****,则所有参数都要用any相关的参数,否则mock不成功。

总的来说,在it当中,只有你想mock一个对象,一定可以,比如你在A类中用到了B类,那么在prepareForTest中增加A类的注解。

如下:

@PrepareForTest({A.class})然后,在it中 声明一个B类,B b = PowerMockito.mock(B.class);这时候,就可以指定b的方法的返回值,或 PowerMockit.doNothing().when(b).方法名(),让该方法什么也不做。

最后,再讲A实例化。PowerMockit是讲究mock设置顺序的。一定要注意。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: PowerMockito的基本使用解析

本文链接: https://www.lsjlt.com/news/130481.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • PowerMockito的基本使用解析
    PowerMockito经常会结合Mockito使用,先说一下这2个的介绍: 1.Mockito和PowerMockito的简介 Mockito和PowerMockito是什么东西呢...
    99+
    2024-04-02
  • PowerMockito的基本使用方式
    本篇内容主要讲解“PowerMockito的基本使用方式”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“PowerMockito的基本使用方式”吧!PowerMockito经常会结合Mockito...
    99+
    2023-06-20
  • 使用Python解析JSON数据的基本方
    Python的json模块提供了一种很简单的方式来编码和解码JSON数据。 其中两个主要的函数是 json.dumps() 和 json.loads() , 要比其他序列化函数库如pickle的接口少得多。 下面演示如何将一个...
    99+
    2023-01-31
    数据 Python JSON
  • go-cache的基本使用场景示例解析
    目录什么是 go-cache使用导入快速开始常量与结构体常量结构体Set()Get()删除其他备份恢复数据什么是 go-cache go-cache 是一个轻量级...
    99+
    2023-05-17
    go-cache使用场景 go-cache
  • Spring中RedisTemplate的基本使用浅析
    目录spring-data-redis项目使用步骤spring-data-redis项目   spring-data-redis提供了在Spring应用中通过简单...
    99+
    2023-02-21
    Spring RedisTemplate Spring RedisTemplate基本操作
  • 基于useImperativeHandle的使用解析
    目录useImperativeHandle的使用useImperativeHandle使用useImperativeHandle时父组件第一次没拿到子组件方法背景需求问题解决方法us...
    99+
    2022-11-13
    useImperativeHandle use Imperative
  • Flask-Sqlalchemy的基本使用详解
    目录一: 基本使用:1:环境的安装:2:组件初始化:3:构建模型类:二:数据操作:1:增加数据:2:查询数据:3:修改数据:4:删除数据:三:高级机制:1:刷新数据:2:多表查询:一...
    99+
    2024-04-02
  • metaObjecthandler 的基本理解与使用
    metaObjecthandler:元数据对象处理器 MetaObjectHandler接口是mybatisPlus为我们提供的的一个扩展接口,我们可以利用这个接口在我们插入或者更新数据的时候,为一些字段指定默认值。 使用场景:公共字段填充...
    99+
    2023-08-31
    mysql 数据库 java
  • gochan基本使用详解
    目录1、有缓冲的chan 与无缓冲的chan2、有缓冲的chan3、利用chan 实现生产者消费者4、利用chan 实现同步5、并发处理1、有缓冲的chan 与无缓冲的chan 怎么...
    99+
    2023-05-18
    go chan使用 go chan
  • Oracle中DECODE函数的基本用法解析
    Oracle中DECODE函数的基本用法解析 在Oracle数据库中,DECODE函数是一种非常常用的函数,用于实现类似于多层if-else语句的逻辑判断和数值替换。DECODE函数的...
    99+
    2024-03-07
    函数 oracle decode
  • JavaWeb.servlet的基本使用方法详解
    目录前言:一.实现servlet二.开发模式 三.继承Servlet 总结前言: 我们在前几篇文章里的web项目都是用jsp文件完成的,那么什么时候jsp算是学完...
    99+
    2024-04-02
  • Swagger及knife4j的基本使用详解
    目录Swagger以及knife4j基本使用Swagger 介绍:Restful 面向资源SpringBoot使用swaggerKnife4j --Swagger增强工具Swagge...
    99+
    2024-04-02
  • 详解adb工具的基本使用
    目录adb 是什么?adb的基本使用adb 是什么? adb全称Android Debug Bridge,是Android SDK中的一个工具, 使用adb可以直接操作管理Andro...
    99+
    2022-11-13
    adb工具使用 adb工具
  • EasyExcel 的基本使用
    EasyExcel EasyExcel 是一个基于 Java 的简单、省内存的读写 Excel 的开源项目。在尽可能节约内存的情况下支持读写百 M 的 Excel。 官网:https://easye...
    99+
    2023-09-12
    java excel spring boot
  • nacos的基本使用
    1、nacos的安装 1、首先要使用nacos那肯定得先下载nacos nacos的GitHub下载地址 2、解压并且放到自己想放的目录,打开bin目录下的startup.cmd(windows下)...
    99+
    2023-10-25
    spring cloud java spring boot
  • 怎么进行spark的基本算子使用和源码解析
    这篇文章将为大家详细讲解有关怎么进行spark的基本算子使用和源码解析,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。一.coalesce1.coalesce源码2.coalesce解释是窄依...
    99+
    2023-06-02
  • csv.reader的基本使用
    一、简单介绍 csv.reader(file, delimiter='\t'),其中 delimiter 代表分隔符,通常根据数据集中相邻元素之间的分隔方式来设定,函数默认每行数据的元素间是以逗号分隔(也可以设置为'\t')。 csv.re...
    99+
    2023-09-03
    python 数据挖掘
  • Linux的基本使用
    🐧🐧🐧Linux作为一个开源的操作系统,其在服务器上,PC上,嵌入式设备上都是很好的操作系统,而大部分的公司也都在使用Linux操作系统,那么就让我...
    99+
    2023-09-04
    linux 服务器
  • PyCharm的基本使用
    PyCharm是我一直在使用的python编辑器,今天具体讲一下PyCharm的使用。下载首先是下载PyCharm,PyCharm的下载地址:https://www.jetbrains.com/pycharm/这个是一个商业软件,大家可以选...
    99+
    2023-06-02
  • MySQL的基本使用
    目录 1、数据库基础 2、MySQL数据库的使用 3、数据库基本操作 4、常用函数 5、MySQL自带库 1、数据库基础 数据(Data):图像、语音、文字等 在计算机系统中,各种字母、数字符号的组合、语音、图形、图像等统称为数据。 ...
    99+
    2023-10-06
    网络安全 web安全 安全 mysql
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作