我们编写代码的时候,总会写一些工具类,为了方便调用喜欢使用static关键字来修饰对应方法。

那么现在举例说明,还是准备两个接口,第一个是查询学生总数,第二个是新增学生两个接口,具体示例代码如下:

package com.rongrong.powermock.mockstatic;

import com.rongrong.powermock.service.Student;

/**
* @author rongrong
* @version 1.0
* @date 2019/11/23 8:08
*/
public class StudentStaticService { /**
* 获取学生总数
* @return
*/
public int getStudentTotal(){
return StudentUtils.getStudent();
} /**
* 创建一个学生
* @param student
*/
public void createStudent(Student student){
StudentUtils.createStudent(student);
}
}

接着我们再来看看这个静态工具类StudentUtils,具体代码示例如下:

package com.rongrong.powermock.mockstatic;

import com.rongrong.powermock.service.Student;

/**
* @author rongrong
* @version 1.0
* @date 2019/11/23 7:38
*/
public class StudentUtils {
/**
* 获取学生总数
* @return
*/
public static int getStudent(){
throw new UnsupportedOperationException();
} /**
* 创建一个学生
* @param student
*/
public static void createStudent(Student student){
throw new UnsupportedOperationException();
}
}

接下来我们用传统方式,来做单元测试,示例代码如下:

    @Test
public void testGetStudnetTotal(){
StudentStaticService staticService = new StudentStaticService();
int studentTotal = staticService.getStudentTotal();
assertEquals(studentTotal,10);
} @Test
public void testCreateStudent(){
StudentStaticService staticService = new StudentStaticService();
staticService.createStudent(new Student());
assertTrue(true);
}

接着运行下测试用例,结果肯定报错了,为什么报错,这里就不再细说了,参考之前文章,报错,如下图所示:

接下来我们使用powermock来进行测试,具体示例代码如下:

 @Test
public void testGetStudentWithMock(){
//先mock工具类对象
PowerMockito.mockStatic(StudentUtils.class);
//模拟静态类调用
PowerMockito.when(StudentUtils.getStudent()).thenReturn(10);
//构建service
StudentStaticService service = new StudentStaticService();
int studentTotal = service.getStudentTotal();
assertEquals(10,studentTotal);
} @Test
public void testCreateStudentWithMock(){
//先模拟静态工具类
PowerMockito.mockStatic(StudentUtils.class);
//模拟调用
PowerMockito.doNothing().when(StudentUtils.class);
//构建service
StudentStaticService service = new StudentStaticService();
Student student = new Student();
service.createStudent(student);
//这里用powermock来验证,而不是mock,更体现了powermock的强大
PowerMockito.verifyStatic();
}

再次运行,测试通过,如下图所示:

运行之前先让powermock为我们准备了StudentUtils工具类,而且采用mockstatic的方法,最后我们用powermock.verifyStatic()验证,而不是mock,更体现了powermock的强大。

PowerMock学习(四)之Mock static的使用的更多相关文章

  1. PowerMock学习(十一)之Mock private methods的使用

    Mock  private methods 就是mock私有方法啦,学到这不难发现,我们其实大部分都是通过反射去完成单元测试的,但是在实际中,某个类中的私有方法,个人不建议使用反射来测试,因为有时候会 ...

  2. PowerMock学习(八)之Mock Argument Matcher的使用

    前言 本计划在上周六日将powermock学完,并同步到博客中,结果自己没经得住诱惑,又开始去打王者荣耀了.虽然两天时间我从钻石一升到了星耀V四星,但是我并没有觉得很开心,相反很失落呢.不得不说腾讯的 ...

  3. PowerMock学习(三)之Mock局部变量

    编写powermock用例步骤: 类上面先写这两个注解@RunWith(PowerMockRunner.class).@PrepareForTest(StudentService.class) 先模拟 ...

  4. PowerMock学习(七)之Mock Constructor的使用

    前言 我们在编码的时候,总习惯在构造器中传参数,那么在powermock中是怎么模拟带参数构造的呢,这并不难. 模拟场景 我们先模拟这样一个场景,通过dao中的传入一个是布尔类型(是否加载)和一个枚举 ...

  5. PowerMock学习(九)之Mock Answer的使用

    关于Mock Answer 上一篇文章,有介绍过关于Arguments Matche的使用,其实 Answer的作用与其比较类似,但是它比 Arguments Matcher 更加强大. Argume ...

  6. 简单介绍如何使用PowerMock和Mockito来mock 1. 构造函数 2. 静态函数 3. 枚举实现的单例 4. 选择参数值做为函数的返回值(转)

    本文将简单介绍如何使用PowerMock和Mockito来mock1. 构造函数2. 静态函数3. 枚举实现的单例4. 选择参数值做为函数的返回值5. 在调用mock出来的方法中,改变方法参数的值 一 ...

  7. mock static方法

    <dependency> <groupId>org.powermock</groupId> <artifactId>powermock-api-mock ...

  8. ZigBee学习四 无线+UART通信

    ZigBee学习四 无线+UART通信 1) 协调器编程 修改coordinator.c文件 byte GenericApp_TransID; // This is the unique messag ...

  9. PowerMock学习之PoweMock的入门(二)

    前言 在上一篇<PowerMock学习之PoweMock的入门(一)>文章中,已经简单提及一些关于powermock的用法,但是入门还未完,我还要坚持把它学习并坚持更新到博客中. Mock ...

  10. TweenMax动画库学习(四)

    目录            TweenMax动画库学习(一)            TweenMax动画库学习(二)            TweenMax动画库学习(三)            Tw ...

随机推荐

  1. c++11::std::optional

    std::optional还有一个类似于智能指针的接口, 它可以显式转化为bool来表示std::optional是否有一个值. 指针的解引用操作符*和->都实现了, 但是没有std::bad_ ...

  2. Codeforces--Books Exchange (hard version)

    题目链接http://codeforces.com/contest/1249/problem/B2 .并查集思想,将数分成多个集合,每个集合的大小就是一轮的所需天数. Map[i]存储数据. flag ...

  3. JS单例对象与构造函数对象的区别

    JavaScript对象有几种: 内置对象如Global,Math对象等等. 本地对象如Object.Function.Array.String.Boolean.Number.Date.RegExp. ...

  4. Distinct 实现自定义去重

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  5. win7更新,360手机安装谷歌框架

    这两天把11平台被卸载了,不能打竞技场了,很伤心. 成年男子,总要找点有趣的事情去做.我准备洗心革面,好好学习.(巴拉巴拉巴拉一万字.) 首先第一件事情就是重装系统,(由于买了个假显卡,win10以上 ...

  6. IDEA配置maven+错误记录

    使用maven并不是那么顺利所以把自己遇到的问题也记录一下 下载maven 从官网下载maven官网 配置环境变量 新建一个变量名:MAVEN_HOME 值:maven目录 path:%MAVEN_H ...

  7. WordCount的实现和测试

    WordCount 一.开头 (1)合作者:201631107110,201631083416 (2)代码地址:https://gitee.com/zhaoxiaoqin/WordCount.git ...

  8. Scrapy 实现爬取多页数据 + 多层url数据爬取

    项目需求:爬取https://www.4567tv.tv/frim/index1.html网站前三页的电影名称和电影的导演名称 项目分析:电影名称在初次发的url返回的response中可以获取,可以 ...

  9. 第三十三章 System V共享内存与信号量综合

    用信号量解决生产者.消费者问题 实现shmfifo ip.h #ifndef _IPC_H #define _IPC_H #include <unistd.h> #include < ...

  10. php经典设计模式和Trait类代码的复用

    PHP经典设计模式 <?php /** * 单例模式 */ class Site { #定义属性 public $siteName; #定义本类的静态实例 protected static $i ...