PowerMock使用详解
- 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使用详解相关推荐
- Java单元测试之JUnit4详解
2019独角兽企业重金招聘Python工程师标准>>> Java单元测试之JUnit4详解 与JUnit3不同,JUnit4通过注解的方式来识别测试方法.目前支持的主要注解有: @B ...
- Java基础学习总结(24)——Java单元测试之JUnit4详解
Java单元测试之JUnit4详解 与JUnit3不同,JUnit4通过注解的方式来识别测试方法.目前支持的主要注解有: @BeforeClass 全局只会执行一次,而且是第一个运行 @Before ...
- (十)Maven依赖详解
1.何为依赖? 比如你是个男的,你要生孩子,呸呸呸...男的怎么生孩子,所以你得依赖你老婆,不过也不一定咯,你也可以依赖其她妹子. 我们在平时的项目开发中也是同理,你需要依赖一些东西才能实现相应的功能 ...
- Spring AOP实现原理详解之Cglib代理实现
引入 我们在前文中已经介绍了SpringAOP的切面实现和创建动态代理的过程,那么动态代理是如何工作的呢?本文主要介绍Cglib动态代理的案例和SpringAOP实现的原理. 要了解动态代理是如何工作 ...
- 从命令行到IDE,版本管理工具Git详解(远程仓库创建+命令行讲解+IDEA集成使用)
首先,Git已经并不只是GitHub,而是所有基于Git的平台,只要在你的电脑上面下载了Git,你就可以通过Git去管理"基于Git的平台"上的代码,常用的平台有GitHub.Gi ...
- JVM年轻代,老年代,永久代详解
秉承不重复造轮子的原则,查看印象笔记分享连接↓↓↓↓ 传送门:JVM年轻代,老年代,永久代详解 速读摘要 最近被问到了这个问题,解释的不是很清晰,有一些概念略微模糊,在此进行整理和记录,分享给大家.在 ...
- docker常用命令详解
docker常用命令详解 本文只记录docker命令在大部分情境下的使用,如果想了解每一个选项的细节,请参考官方文档,这里只作为自己以后的备忘记录下来. 根据自己的理解,总的来说分为以下几种: Doc ...
- 通俗易懂word2vec详解词嵌入-深度学习
https://blog.csdn.net/just_so_so_fnc/article/details/103304995 skip-gram 原理没看完 https://blog.csdn.net ...
- 深度学习优化函数详解(5)-- Nesterov accelerated gradient (NAG) 优化算法
深度学习优化函数详解系列目录 深度学习优化函数详解(0)– 线性回归问题 深度学习优化函数详解(1)– Gradient Descent 梯度下降法 深度学习优化函数详解(2)– SGD 随机梯度下降 ...
最新文章
- 赛道一出,今后无需再熬夜
- Java的新项目学成在线笔记-day8(三)
- (九)栈上分配与逃逸分析
- java导出模板 pdf设置字体_有哪些相见恨晚的PPT模板网站?
- linux删除之前的文件在哪里,Linux下,如何将最后修改时间在某个时间之前的文件删除去?...
- 【Opencv实战】这个印章“神器”够牛,节省了时间提高了效率,厉害~(附完整源码)
- ACM入门之【线性筛】
- 独占一行 html_HTML基础-语义化标签
- flutter能开发游戏吗_Steam上架游戏开发软件,不用代码也能制作游戏,而且还是免费的...
- Linux日志系统与日志库zlog
- DCMTK3.6.5+cmake3.7.1+VS2017配置过程
- java udp转发_【Java】UDP发包的简单实现
- 【lssvm分类】基于粒子群算法优化最小二乘支持向量机lssvm实现数据分类matlab代码
- 第一次用python写爬虫
- C#学习 - XML Serialization
- 修改手机屏幕刷新率_手机屏幕刷新率那点事儿!
- JVM调优-GC基本原理和调优关键分析
- 坐标系(Coordinate System)
- 简单五子棋(单机版-C)
- 关于在Unity2018中使用Vuforia实现基础图片识别AR展现效果
热门文章
- 换种方式实现阖家团圆,2022旗舰投影坚果J10S被种草
- 用c语言编写:从健盘输入一个两位数的正整数 a,将其转换形成一个整数b并输出b。 转换的方式是:将a中较大的数码作为b的十位,剩余的数码作为上的个位。例如,当输入a =49,则结果 b=94...
- scpi指令转换c语言,SCPI 标准命令
- 带官方直播功能的网站,你见过吗?
- 贝叶斯概率(先验概率后验概率)
- HBuilderX uni-app 打包发行微信小程序
- 使用php语言开发网站的注意事项
- 地理空间数据库建设护航国家防汛抗旱工作
- JVM 虚拟机详解内部原理(小白必看!)
- 港中文周博磊团队:无监督条件下GAN潜在语义识别指南