• 1. PowerMock是什么?
  • 2. PowerMock包引入
  • 3. 重要注解说明
  • 4. 示例

1. PowerMock是什么?

PowerMock是一个Java模拟框架,用于解决测试问题。

举个例子,你在使用Junit进行单元测试时,并不想让测试数据进入数据库,怎么办?这个时候就可以使用PowerMock,拦截数据库操作,并模拟返回参数。

2. PowerMock包引入

<!-- PowerMock JUnit 4.4+ Module -->
<dependency><groupId>org.powermock</groupId><artifactId>powermock-module-junit4</artifactId><version>2.0.0</version><scope>test</scope>
</dependency>
<!-- PowerMock Mockito2 API -->
<dependency><groupId>org.powermock</groupId><artifactId>powermock-api-mockito2</artifactId><version>2.0.0</version><scope>test</scope>
</dependency>
<dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.11</version><scope>test</scope>
</dependency>

3. 重要注解说明

@RunWith(PowerMockRunner.class) // 告诉JUnit使用PowerMockRunner进行测试
@PrepareForTest({RandomUtil.class}) // 所有需要测试的类列在此处,适用于模拟final类或有final, private, static, native方法的类
@PowerMockIgnore("javax.management.*") //为了解决使用powermock后,提示classloader错误

4. 示例

4.1 普通Mock

/***********************Prepare****************************/public interface MockMapper {public int count(MockModel model);}@Service
public class MockServiceImpl {@Autowiredprivate MockMapper mockMapper;public int count(MockModel model) {return mockMapper.count(model);}
}/*****************************************************/@RunWith(PowerMockRunner.class) // 告诉JUnit使用PowerMockRunner进行测试
@PrepareForTest({MockUtil.class}) // 所有需要测试的类列在此处,适用于模拟final类或有final, private, static, native方法的类
@PowerMockIgnore("javax.management.*") //为了解决使用powermock后,提示classloader错误
public class MockExample {// 将@Mock注解的示例注入进来@InjectMocksprivate MockServiceImpl mockService;@Mockprivate MockMapper mockMapper;/*** mock普通方法*/@Testpublic void testSelectAppAdvertisementList() {MockModel model = new MockModel();PowerMockito.when(mockMapper.count(model)).thenReturn(2);Assert.assertEquals(2, mockService.count(model));}
}

2. Mock静态方法

/************************Prepare****************************/
public class MockUtil {private static final Random random = new Random();public static int nextInt(int bound) {return random.nextInt(bound);}
}
/***************************************************/@RunWith(PowerMockRunner.class) // 告诉JUnit使用PowerMockRunner进行测试
@PrepareForTest({MockUtil.class}) // 所有需要测试的类列在此处,适用于模拟final类或有final, private, static, native方法的类
@PowerMockIgnore("javax.management.*") //为了解决使用powermock后,提示classloader错误
public class MockExample {@Test public void testStaticMethod() { PowerMockito.mockStatic(MockUtil.class); PowerMockito.when(MockUtil.nextInt(10)).thenReturn(7); Assert.assertEquals(7, MockUtil.nextInt(10)); }
}

3. Mock方法内new出来的对象

/****************************************************/
public boolean makeFile(String path) {File file = new File(path);return file.exists();
}
/****************************************************/@RunWith(PowerMockRunner.class) // 告诉JUnit使用PowerMockRunner进行测试
@PrepareForTest({MockUtil.class, MockServiceImpl.class}) // 所有需要测试的类列在此处,适用于模拟final类或有final, private, static, native方法的类
@PowerMockIgnore("javax.management.*") //为了解决使用powermock后,提示classloader错误
public class MockExample {// 将@Mock注解的示例注入进来@InjectMocksprivate MockServiceImpl mockService;@Testpublic void testNewObject() throws Exception {File file = PowerMockito.mock(File.class);PowerMockito.whenNew(File.class).withArguments("abc").thenReturn(file);PowerMockito.when(file.exists()).thenReturn(true);Assert.assertTrue(mockService.makeFile("abc"));    }
}

4.不让测试数据进入数据库(关键点:)

不让测试数据进入数据库的关键点:@Transactional、@Rollback(true)

Test用例:

import com.alibaba.fastjson.JSON;
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.mockito.internal.util.MockUtil;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PowerMockIgnore;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.springframework.test.annotation.Rollback;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.transaction.annotation.Transactional;import javax.annotation.Resource;
import java.util.Random;/*** PowerMock是一个Java模拟框架,用于解决测试问题。* 举个例子,你在使用Junit进行单元测试时,并不想让测试数据进入数据库,怎么办?这个时候就可以使用PowerMock,拦截数据库操作,并模拟返回参数。*/
@RunWith(SpringJUnit4ClassRunner.class)
@PrepareForTest({MockUtil.class})
@PowerMockIgnore("javax.management.*")
@Transactional
@ContextConfiguration(locations = {"classpath*:applicationContext.xml"})
public class DemoMockTest {//将@Mock注解的示例注入进来@Resource@InjectMocksprivate DemoService demoService;@Mockprivate SingleService singleService;public int randomNum(int min, int max) {Random random = new Random();int s = random.nextInt(max) % (max - min + 1) + min;return s;}/*** singleSequenceService服务mock,mock结果为ID值*/@Beforepublic void testInsertMockSuccess() {Random random = new Random();long id = random.nextInt(999999) % (1000000);MockitoAnnotations.initMocks(this);PowerMockito.when(singleService.getId("demo")).thenReturn(id);}@Rollback(true)@Testpublic void insert() {Demo demo = new Demo();demo.setSellerName("AA技术有限公司");demo.setSellerNo("10000");demoService.insert(demo);}@Testpublic void getDemo() {Demo demo = demoService.getDemo(1L);System.out.println(JSON.toJSONString(demo));}}

demoService实现:

/*** Demo*/
@Service("demoService")
public class DemoServiceImpl implements DemoService {@Resourceprivate DemoManager demoManager;@Resourceprivate SingleService singleService;@Overridepublic void insert(Demo demo) {//唯一ID生成(分库分表)long id = singleService.getId("demo");demo.setId(id);demoManager.insert(demo);}}

文章来源:https://www.cnblogs.com/lovezmc/p/11232112.html

PowerMock使用详解相关推荐

  1. Java单元测试之JUnit4详解

    2019独角兽企业重金招聘Python工程师标准>>> Java单元测试之JUnit4详解 与JUnit3不同,JUnit4通过注解的方式来识别测试方法.目前支持的主要注解有: @B ...

  2. Java基础学习总结(24)——Java单元测试之JUnit4详解

    Java单元测试之JUnit4详解 与JUnit3不同,JUnit4通过注解的方式来识别测试方法.目前支持的主要注解有: @BeforeClass 全局只会执行一次,而且是第一个运行 @Before  ...

  3. (十)Maven依赖详解

    1.何为依赖? 比如你是个男的,你要生孩子,呸呸呸...男的怎么生孩子,所以你得依赖你老婆,不过也不一定咯,你也可以依赖其她妹子. 我们在平时的项目开发中也是同理,你需要依赖一些东西才能实现相应的功能 ...

  4. Spring AOP实现原理详解之Cglib代理实现

    引入 我们在前文中已经介绍了SpringAOP的切面实现和创建动态代理的过程,那么动态代理是如何工作的呢?本文主要介绍Cglib动态代理的案例和SpringAOP实现的原理. 要了解动态代理是如何工作 ...

  5. 从命令行到IDE,版本管理工具Git详解(远程仓库创建+命令行讲解+IDEA集成使用)

    首先,Git已经并不只是GitHub,而是所有基于Git的平台,只要在你的电脑上面下载了Git,你就可以通过Git去管理"基于Git的平台"上的代码,常用的平台有GitHub.Gi ...

  6. JVM年轻代,老年代,永久代详解​​​​​​​

    秉承不重复造轮子的原则,查看印象笔记分享连接↓↓↓↓ 传送门:JVM年轻代,老年代,永久代详解 速读摘要 最近被问到了这个问题,解释的不是很清晰,有一些概念略微模糊,在此进行整理和记录,分享给大家.在 ...

  7. docker常用命令详解

    docker常用命令详解 本文只记录docker命令在大部分情境下的使用,如果想了解每一个选项的细节,请参考官方文档,这里只作为自己以后的备忘记录下来. 根据自己的理解,总的来说分为以下几种: Doc ...

  8. 通俗易懂word2vec详解词嵌入-深度学习

    https://blog.csdn.net/just_so_so_fnc/article/details/103304995 skip-gram 原理没看完 https://blog.csdn.net ...

  9. 深度学习优化函数详解(5)-- Nesterov accelerated gradient (NAG) 优化算法

    深度学习优化函数详解系列目录 深度学习优化函数详解(0)– 线性回归问题 深度学习优化函数详解(1)– Gradient Descent 梯度下降法 深度学习优化函数详解(2)– SGD 随机梯度下降 ...

最新文章

  1. 赛道一出,今后无需再熬夜
  2. Java的新项目学成在线笔记-day8(三)
  3. (九)栈上分配与逃逸分析
  4. java导出模板 pdf设置字体_有哪些相见恨晚的PPT模板网站?
  5. linux删除之前的文件在哪里,Linux下,如何将最后修改时间在某个时间之前的文件删除去?...
  6. 【Opencv实战】这个印章“神器”够牛,节省了时间提高了效率,厉害~(附完整源码)
  7. ACM入门之【线性筛】
  8. 独占一行 html_HTML基础-语义化标签
  9. flutter能开发游戏吗_Steam上架游戏开发软件,不用代码也能制作游戏,而且还是免费的...
  10. Linux日志系统与日志库zlog
  11. DCMTK3.6.5+cmake3.7.1+VS2017配置过程
  12. java udp转发_【Java】UDP发包的简单实现
  13. 【lssvm分类】基于粒子群算法优化最小二乘支持向量机lssvm实现数据分类matlab代码
  14. 第一次用python写爬虫
  15. C#学习 - XML Serialization
  16. 修改手机屏幕刷新率_手机屏幕刷新率那点事儿!
  17. JVM调优-GC基本原理和调优关键分析
  18. 坐标系(Coordinate System)
  19. 简单五子棋(单机版-C)
  20. 关于在Unity2018中使用Vuforia实现基础图片识别AR展现效果

热门文章

  1. 换种方式实现阖家团圆,2022旗舰投影坚果J10S被种草
  2. 用c语言编写:从健盘输入一个两位数的正整数 a,将其转换形成一个整数b并输出b。 转换的方式是:将a中较大的数码作为b的十位,剩余的数码作为上的个位。例如,当输入a =49,则结果 b=94...
  3. scpi指令转换c语言,SCPI 标准命令
  4. 带官方直播功能的网站,你见过吗?
  5. 贝叶斯概率(先验概率后验概率)
  6. HBuilderX uni-app 打包发行微信小程序
  7. 使用php语言开发网站的注意事项
  8. 地理空间数据库建设护航国家防汛抗旱工作
  9. JVM 虚拟机详解内部原理(小白必看!)
  10. 港中文周博磊团队:无监督条件下GAN潜在语义识别指南