返回顶部
首页 > 资讯 > 精选 >PowerMockito的基本使用方式
  • 560
分享到

PowerMockito的基本使用方式

2023-06-20 16:06:23 560人浏览 泡泡鱼
摘要

本篇内容主要讲解“PowerMockito的基本使用方式”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“PowerMockito的基本使用方式”吧!PowerMockito经常会结合Mockito

本篇内容主要讲解“PowerMockito的基本使用方式”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“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结合使用的时候,我们需要考虑兼容性的问题。

两者的版本需要兼容

MockitoPowerMockito
2.8.9+2.x
2.8.0-2.8.91.7.x
2.7.51.7.0RC4
2.4.01.7.0RC2
2.0.0-beta - 2.0.42-beta1.6.5-1.7.0RC
1.10.8 - 1.10.x1.6.2 - 2.0
1.9.5-rc1 - 1.9.51.5.0 - 1.5.6
1.9.0-rc1 & 1.9.01.4.10 - 1.4.12
1.8.51.3.9 - 1.4.9
1.8.41.3.7 & 1.3.8
1.8.31.3.6
1.8.1 & 1.8.21.3.5
1.81.3
1.71.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; @Servicepublic 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>

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

@MockiXxService iXxService;

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

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

测试结果

PowerMockito的基本使用方式

PowerMockito的基本使用方式

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设置顺序的。一定要注意。

到此,相信大家对“PowerMockito的基本使用方式”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: PowerMockito的基本使用方式

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

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

猜你喜欢
  • PowerMockito的基本使用方式
    本篇内容主要讲解“PowerMockito的基本使用方式”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“PowerMockito的基本使用方式”吧!PowerMockito经常会结合Mockito...
    99+
    2023-06-20
  • PowerMockito的基本使用解析
    PowerMockito经常会结合Mockito使用,先说一下这2个的介绍: 1.Mockito和PowerMockito的简介 Mockito和PowerMockito是什么东西呢...
    99+
    2024-04-02
  • TableLayout的基本使用方式
    TableLayout是一个用于显示表格数据的布局容器,它可以让子视图按行和列进行排列。下面是TableLayout的基本使用方式:...
    99+
    2023-09-13
    TableLayout
  • SpringBoot JMX的基本使用方式
    目录SpringBoot JMX的基本使用1. 声明2. 基本demo3. 执行结果springboot自定义jmx对象什么情况我们需要使用JMX?那要怎么做呢?SpringBoot...
    99+
    2024-04-02
  • 怎样使用PowerMockito 测试静态方法
    PowerMockito 测试静态方法 假如有下面一个类DemoStatic,它里面定义了各种静态方法,这些静态方法可能是一些Utilities方法,辅助其它的类。 packag...
    99+
    2024-04-02
  • HttpClient基本功能的使用Get方式
    HttpClient是一个开源的Java HTTP客户端库,可以发送HTTP请求,并接收HTTP响应。使用HttpClient发送G...
    99+
    2023-09-23
    HttpClient
  • react中braft-editor的基本使用方式
    目录braft-editor的基本使用项目需求使用braft-editor踩坑记,引用 braft-utils有错误遇到的问题解决方式braft-editor的基本使用 项目需求 实...
    99+
    2024-04-02
  • HttpClient基本功能的使用 Get方式
    HttpClient是一个功能强大、开源的HTTP客户端库,可以用于发送HTTP请求和处理HTTP响应。使用HttpClient的G...
    99+
    2023-08-24
    Get
  • node.js中joi模块的基本使用方式
    目录node.js joi模块的使用参数校验:使用joi基础使用常见schema特殊情况demosnode.js joi模块的使用 //引入joi模块 const Joi = req...
    99+
    2024-04-02
  • MySQL Shell基本使用方式及SQL syntax
    MySQL是管理数据库的工具,有图形化界面workbench和命令行工具shell。 这里我们介绍shell的基本使用方式 OS:Windows 配置:MySQL8.0 MySQL Basic Usa...
    99+
    2023-09-10
    mysql sql 数据库
  • 达梦数据库(DM8)基本使用方式
    达梦数据库(DM8)基本使用方式 1、麒麟操作系统安装DM81.1规划安装路径和用户1.2挂载DM8的ISO镜像文件1.3安装使用图形化界面安装使用命令行安装 2、创建数据库...
    99+
    2023-09-11
    linux 服务器 数据库
  • Collectors.toMap()的基本使用方法
    介绍: 1、Java 8 流的新类 java.util.stream.Collectors 实现了 java.util.stream.Collector 接口,同时又提供了大量的方法对流 ( stream ) 的元素执行 map and ...
    99+
    2023-09-06
    java Powered by 金山文档
  • GNS3的基本使用方法
    GNS3 基本使用方法1.一张基本的拓扑图需要一台路由器,一台交换机,PC一台这里是所有的路由器和交换机及PC,在GNS3里面将路由器直接拖到工作面板中是没有用的,因为每个路由器需要对应的镜像,如图所示:添加镜像的方法在这里面选择...
    99+
    2023-01-31
    使用方法
  • PowerShell的基本使用方法
    目录什么是powershell1.   如何启动PowerShell2.   如何运行程序、脚本和已有的软件3.   运行PowerShell命令4.   如何查找指定命令以及命令详...
    99+
    2024-04-02
  • mybatis的基本使用方法
    本篇文章给大家分享的是有关mybatis的基本使用方法,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。具体代码如下所示:<configuration> <pr...
    99+
    2023-05-31
    mybatis
  • Android应用中使用DOM方式解析XML格式数据的基本方法
    DOM比SAX更容易掌握,因为她没有涉及回调和复杂的状态管理,然而,DOM的实现常常将所有的XML节点保存在内存中,这样使的处理较大的文档效率低。 XML基本的节点类型 nod...
    99+
    2022-06-06
    方法 数据 解析xml xml格式 XML dom Android
  • Linux系统下Git的基本配置和使用方式
    本篇内容主要讲解“Linux系统下Git的基本配置和使用方式”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Linux系统下Git的基本配置和使用方式”吧!git config配置文件一.Git已...
    99+
    2023-06-12
  • Apache POI的基本使用方法
    今天就跟大家聊聊有关Apache POI的基本使用方法,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。基本介绍POIpache POI是用Java编写的免费开源的跨平台的Java AP...
    99+
    2023-06-25
  • python的urllib2包基本使用方
    【另附】:python笔记系列1. urllib2.urlopen(request)url = "http://www.baidu.com" #url还可以是其他协议的路径,比如ftp values = {'name' : 'Michae...
    99+
    2023-01-31
    python
  • linux expect 的基本使用方法
    linux expect 的基本使用方法,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。expect -c "   set timeout -1;&...
    99+
    2023-06-06
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作