编写powermock用例步骤:

  • 类上面先写这两个注解@RunWith(PowerMockRunner.class)、@PrepareForTest(StudentService.class)
  • 先模拟一个假对象即studentdao方法中的局部变量
  • 用无参的方式new对象
  • 再模拟这个对象被调用时,是否有返回,有返回值给出默认值,没有用doNothing()
  • 验证有返回值使用assertEquals即可,无返回值使用Mockito.verify验证

实际案例

接着上一篇文章中的代码,修改下service中的代码,这次我不通过构造器注入Dao,在方法中new一个StudentDao,创建一个名为StudentNewService的类。

具体示例代码如下:

package com.rongrong.powermock.service;

import com.rongrong.powermock.dao.StudentDao;

/**
* @author rongrong
* @version 1.0
* @date 2019/11/17 21:13
*/
public class StudentNewService { /**
* 获取学生个数
* @return返回学生总数
*/
public int getTotal() {
StudentDao studentDao = new StudentDao();
return studentDao.getTotal();
} /**
* 创建学生
* @param student
*/
public void createStudent(Student student) {
StudentDao studentDao = new StudentDao();
studentDao.createStudent(student);
}
}

针对上面修改部分代码,进行单元测试,以下代码有采用传统方式测试和采用powermock方式进行测试,具体代码如下:

package com.rongrong.powermock.service;

import com.rongrong.powermock.dao.StudentDao;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mockito;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner; import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail; /**
* @author rongrong
* @version 1.0
* @date 2019/11/20 21:42
*/
@RunWith(PowerMockRunner.class)
@PrepareForTest(StudentNewService.class)
public class TestNewStudentService { /**
* 传统方式测试
*/
@Test
public void testGetStudentTotal() {
StudentNewService studentNewService = new StudentNewService();
int total = studentNewService.getTotal();
assertEquals(total, 10);
} /**
* @desc测试有返回值类型 采用powermock进行测试获取学生个数
*/
@Test
public void testGetStudentTotalWithPowerMock() {
//先模拟一个假对象即studentdao方法中的局部变量
StudentDao studentDao = PowerMockito.mock(StudentDao.class);
try {
//这句话我按照英文理解就是,我用无参的方式new了一个StudentDao对象
PowerMockito.whenNew(StudentDao.class).withNoArguments().thenReturn(studentDao);
//再模拟这个对象被调用时,我们默认假定返回10个证明调用成功
PowerMockito.when(studentDao.getTotal()).thenReturn(10);
//这里就是service就不用再说了
StudentNewService studentNewService = new StudentNewService();
int total = studentNewService.getTotal();
assertEquals(total, 10);
} catch (Exception e) {
fail("测试失败了!!!");
e.printStackTrace();
} } /**
* @desc测试的无返回值类型 采用powermock进行测试创建学生
*/
@Test
public void testCreateStudentWithPowerMock() {
//先模拟一个假对象即studentdao方法中的局部变量
StudentDao studentDao = PowerMockito.mock(StudentDao.class);
try {
//这句话我按照英文理解就是,我用无参的方式new了一个StudentDao对象
PowerMockito.whenNew(StudentDao.class).withNoArguments().thenReturn(studentDao);
Student student = new Student();
//这句话注释与否都能运行通过,也就是我只能判断他是否被调用
//PowerMockito.doNothing().when(studentDao).createStudent(student);
//这里就是service就不用再说了
StudentNewService studentNewService = new StudentNewService();
studentNewService.createStudent(student);
Mockito.verify(studentDao).createStudent(student);
} catch (Exception e) {
fail("测试失败了!!!");
e.printStackTrace();
} } }

运行上面的测试用例,会发现第一个失败,后面两个都运行成功,即有返回值和无返回值类型的测试(void类型)。

注意:对于无返回值类型的测试,只能验证其是否被调用,这里还请注意。

PowerMock学习(三)之Mock局部变量的更多相关文章

  1. PowerMock学习(一)之PoweMock的入门--模拟新增学生操作

    关于powermock 在TDD领域Mock框架有很多,比如EasyMock,JMock,Mockito.可能有些同学会好奇了,为什么要重点把powermock拿出来呢,因为powermock可以解决 ...

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

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

  3. PowerMock学习(五)之Verifying的使用

    前言 Verifying是一个非常强大的测试工具,在mock系列框架中使用广泛,主要用于验证方法是否被调用,下面将举例说明. 场景 模拟这样一个场景,通过Dao查询学生,如果存在更新原来学生,不存在则 ...

  4. HTTP学习三:HTTPS

    HTTP学习三:HTTPS 1 HTTP安全问题 HTTP1.0/1.1在网络中是明文传输的,因此会被黑客进行攻击. 1.1 窃取数据 因为HTTP1.0/1.1是明文的,黑客很容易获得用户的重要数据 ...

  5. TweenMax动画库学习(三)

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

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

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

  7. Struts2框架学习(三) 数据处理

    Struts2框架学习(三) 数据处理 Struts2框架框架使用OGNL语言和值栈技术实现数据的流转处理. 值栈就相当于一个容器,用来存放数据,而OGNL是一种快速查询数据的语言. 值栈:Value ...

  8. 4.机器学习——统计学习三要素与最大似然估计、最大后验概率估计及L1、L2正则化

    1.前言 之前我一直对于“最大似然估计”犯迷糊,今天在看了陶轻松.忆臻.nebulaf91等人的博客以及李航老师的<统计学习方法>后,豁然开朗,于是在此记下一些心得体会. “最大似然估计” ...

  9. DjangoRestFramework学习三之认证组件、权限组件、频率组件、url注册器、响应器、分页组件

    DjangoRestFramework学习三之认证组件.权限组件.频率组件.url注册器.响应器.分页组件   本节目录 一 认证组件 二 权限组件 三 频率组件 四 URL注册器 五 响应器 六 分 ...

  10. [ZZ] 深度学习三巨头之一来清华演讲了,你只需要知道这7点

    深度学习三巨头之一来清华演讲了,你只需要知道这7点 http://wemedia.ifeng.com/10939074/wemedia.shtml Yann LeCun还提到了一项FAIR开发的,用于 ...

随机推荐

  1. 机器学习:IB1算法的weka源码详细解析(1NN)

    机器学习的1NN最近邻算法,在weka里叫IB1,是因为Instance Base  1 ,也就是只基于一个最近邻的实例的惰性学习算法. 下面总结一下,weka中对IB1源码的学习总结. 首先需要把 ...

  2. PHP array_fill_keys

    1.函数的作用:将一个数组的元素分别作为键值和一个指定的值组成新的数组: 2.函数的参数: @params array  $array @params mixed $values 3.例子: < ...

  3. if-elif-else分支判断语句(附加continue和break)---举例说明

    一.分支循环语句: a=input("请输入一个五位数字") if(len(a)!=5): print("输入的数字不合格"); elif(a[0::]==a[ ...

  4. 【原】iOS开发进阶(唐巧)读书笔记(二)

    第三部分:iOS开发底层原理 1.Objective-C对象模型 1.1 isa指针 NSObject.h部分代码: NS_ROOT_CLASS @interface NSObject <NSO ...

  5. day05整理

    目录 一.上节课回顾 (一)数据类型 (1)数字类型 (2)字符串类型str (3)列表类型list (4)字典类型dict (二)jieba模块 (三)wordcloud模块 二.文本处理 (一)什 ...

  6. Java基础(三十四)String、StringBuffer类和数据缓冲区Buffer类

    一.String类 1.创建字符串对象 创建字符串对象有两种方法:直接用“=”或者使用“new String(...)” String aStr = "TMZ"; String b ...

  7. 数据结构(四十六)插入排序(1.直接插入排序(O(n²)) 2.希尔排序(O(n3/2)))

    一.插入排序的基本思想 从初始有序的子集合开始,不断地把新的数据元素插入到已排列有序子集合的合适位置上,使子集合中数据元素的个数不断增多,当子集合等于集合时,插入排序算法结束.常用的 插入排序算法有直 ...

  8. SpringBoot与MybatisPlus3.X整合之动态表名 SQL 解析器(七)

    pom.xml <dependencies> <dependency> <groupId>org.springframework.boot</groupId& ...

  9. 设计模式C++描述----11.组合(Composite)模式

    一. 举例 这个例子是书上的,假设有一个公司的组结结构如下: 它的结构很像一棵树,其中人力资源部和财务部是没有子结点的,具体公司才有子结点. 而且最关健的是,它的每一层结构很相似. 代码实现如下: / ...

  10. Unity5-ABSystem(二):AssetBundle导出

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/lodypig/article/detai ...