PowerMock单元测试
在Java程序的单元测试中常用的mock工具有Mockito和EasyMock。但是这两种mock工具都无法实现对静态、final、私有方法或类的mock。因此有了功能强大的PowerMock工具。PowerMock并不是一个独立、全新的工具而是在Mockito和EasyMock的基础上进行的扩展,它分别有针对Mockito级EasyMock的扩展实现。本文主要介绍PowerMock的常见用法:
1.pom依赖
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10<version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-module-junit4</artifactId>
<version>1.6.3</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-api-mockito</artifactId>
<version>1.6.3</version>
<scope>test</scope>
</dependency>
2.基本用法
2.1 测试类加上必要的注解
@RunWith(PowerMockRunner.class)
@PrepareForTest({ExtensionLoader.class,Configs.class}) //静态类,测试类本身(需要mock构造方法时)
@PowerMockIgnore("javax.management.*")
2.2 mock基本对象
测试 convert.convertAndHanlder(method,ref,bead)方法
@Mock
Convert convert; when(convert.convertAndHanlder(eq(method),eq(ref),eq(bead))).thenReturn(bead);
2.3 mock无返回值的方法
@Mock
ProviderComposeConfig providerComposeConfig; doNothing().when(providerComposeConfig).putSync(eq(providerConfig));
2.4 mock方法执行异常场景
@Mock
ProviderComposeConfig providerComposeConfig; doThrow(new Exception("执行失败")).when(providerComposeConfig).putSync(eq(providerConfig));
2.5 mock 静态方法
测试Configs.getConfig(ProviderComposeConfig.class)方法
前提:@PrepareForTest注解中添加该类:ProviderComposeConfig.class
@Mock
ProviderComposeConfig configs; PowerMockito.mockStatic(Configs.class);
when(Configs.getConfig(eq(ProviderComposeConfig.class))).thenReturn(configs);
mock无返回值的static方法
// "xxxUtil" 是类名
// "xxxStaticMethod" 是 static 方法的方法名
// 这里假设 "xxxStaticMethod" 需要两个参数,一个是 int 型,一个是 String 型
PowerMockito.doNothing().when(xxxUtil.class, "xxxStaticMethod", 1,"mysql");
mock可变参数传递
public class Demo {
public static void test(String... args) {
System.out.println(args);
}
}
测试方法:
@RunWith(PowerMockRunner.class)
@PrepareForTest({Demo.class})
@PowerMockIgnore("javax.management.*")
public class DemoTest { @Test
public void test() throws Exception {
PowerMockito.mockStatic(Demo.class);
PowerMockito.doNothing().when(Demo.class,"test",eq("liu1"),eq("liu2"));
Demo.test("liu1","liu2");
} }
2.6 mock 构造方法
前提:@PrepareForTest注解中添加该类:HookContext.class
@Mock
HookContext context; //无参构造
PowerMockito.whenNew(HookContext.class).withNoArguments().thenReturn(context); //有参构造
PowerMockito.whenNew(HookContext.class).withArguments(anystring()).thenReturn(context);
③完成实例
被测试类:
public class HandlerHook {
public final static String id = "handler";
@Override
public Bead doCall(HookContext context, Bead bead, AccessId id) throws Throwable {
ProviderComposeConfig configs = Configs.getConfig(ProviderComposeConfig.class);
ProviderConfig config = configs == null ? null : configs.get(id);
if (config == null) {
// 即没有该服务,1.本地调用 2.客户端信息有误,访问IP:PORT 却没有服务
return null;
}
// 拿到转换器,调用
Convert convert = ExtensionLoader.getExtensionLoader(Convert.class).getExtensionById(ConvertProcessor.id);
return convert.convertAndHanlder(config.getMethod(), config.getRef(), bead);
}
}
测试类:
@RunWith(PowerMockRunner.class)
@PrepareForTest({ExtensionLoader.class,Configs.class})
@PowerMockIgnore("javax.management.*")
public class HandlerHookTest { @Mock
HookContext hookContext; @Mock
Bead bead; @Mock
AccessId accessId; @Mock
ExtensionLoader<Convert> extensionLoader; @Mock
ProviderComposeConfig configs; @Mock
ProviderConfig config; @Mock
Method method ; @Mock
Object ref; @Mock
Convert convert; private HandlerHook handlerHook = new HandlerHook(); @Test
public void doCall() throws Throwable {
PowerMockito.mockStatic(Configs.class);
when(Configs.getConfig(eq(ProviderComposeConfig.class))).thenReturn(configs);
when(configs.get(eq(accessId))).thenReturn(config); PowerMockito.mockStatic(ExtensionLoader.class);
when(ExtensionLoader.getExtensionLoader(eq(Convert.class))).thenReturn(extensionLoader);
when(extensionLoader.getExtensionById(eq("map"))).thenReturn(convert);
when(config.getMethod()).thenReturn(method);
when(config.getRef()).thenReturn(ref); when(convert.convertAndHanlder(eq(method),eq(ref),eq(bead))).thenReturn(bead);
assertEquals(bead, handlerHook.doCall(hookContext, bead, accessId));
} }
PowerMock单元测试的更多相关文章
- PowerMock单元测试踩坑与总结
1.Mock是什么? 通过提供定制的类加载器以及一些字节码篡改技巧的应用,PowerMock 现了对静态方法.构造方法.私有方法以及 Final 方法的模拟支持,对静态初始化过程的移除等强大的功能. ...
- powermock单元测试小结
最近时不时的需要单元测试来写覆盖率.简单总结一下日常心得: 1.首先指明需要测试的类:@PrepareForTest({ RewardGoldServiceImpl.class }) 2.其次在测试类 ...
- 使用MRUnit,Mockito和PowerMock进行Hadoop MapReduce作业的单元测试
0.preliminary 环境搭建 Setup development environment Download the latest version of MRUnit jar from Apac ...
- 使用Powermock进行单元测试,以及常见问题的处理
1. 引言 在进行单元测试时,经常遇到被测方法依赖外部对象和环境,如需要数据库连接,网络通信依赖等,需要进行大量的初始化工作,这时可以采用powermock+mockito对被测对象进行模拟,通过录放 ...
- 单元测试不是梦,Android+PowerMock系列(1) —— 在Eclipse里搭建测试环境
单元测试不好搞阿,虽然从TDD角度出发,可测性强的代码很大程度上就代表着好的设计,但是有些情况也是没办法的,比如单例模式,比如Static方法,比如Final类,传统的Mock技术是没办法解决这些问题 ...
- Spring Boot 2 实践记录之 封装依赖及尽可能不创建静态方法以避免在 Service 和 Controller 的单元测试中使用 Powermock
在前面的文章中(Spring Boot 2 实践记录之 Powermock 和 SpringBootTest)提到了使用 Powermock 结合 SpringBootTest.WebMvcTest ...
- Spring Boot 2 实践记录之 使用 Powermock、Mockito 对 UUID 进行 mock 单元测试
由于注册时,需要对输入的密码进行加密,使用到了 UUID.sha1.md 等算法.在单元测试时,使用到了 Powermock,记录如下. 先看下加密算法: import org.apache.comm ...
- dubbo应用程序的单元测试环境搭建(springtest,powermock,mockito)
转:http://blog.csdn.net/yys79/article/details/66472797 最近,项目中频繁用到dubbo,而且java工程用引用了几十个关联系统的服务(如用户认证,基 ...
- 单元测试及框架简介 --junit、jmock、mockito、powermock的简单使用
转 单元测试及框架简介 --junit.jmock.mockito.powermock的简单使用 2013年08月28日 14:33:06 luvinahlc 阅读数:6413 标签: 测试工具单元测 ...
随机推荐
- 使用pipework将Docker容器配置到本地网络环境中
使用pipework将Docker容器配置到本地网络环境中 需求 在使用Docker的过程中,有时候我们会有将Docker容器配置到和主机同一网段的需求.要实现这个需求,我们只要将Docker容器和主 ...
- SpreadJS 在 Angular2 中支持绑定哪些属性?
SpreadJS 纯前端表格控件是基于 HTML5 的 JavaScript 电子表格和网格功能控件,提供了完备的公式引擎.排序.过滤.输入控件.数据可视化.Excel 导入/导出等功能,适用于 .N ...
- Qt 5.8 移植编译、测试
/****************************************************************************** * Qt 5.8 移植编译.测试 * 说 ...
- mysql安装优化
安装centos7 安装mysql解决方案1 安装mariadb解决方案2 官网下载安装mysql-server时区批量配置编码远程连接my.cnf简版的参数说明核心配置参数升级版mysql存储引擎M ...
- 模块(Modules)
一.引入模块 模块:当编写更大的应用程序时,所有的代码肯定会分成多个文件,这样便于维护,另外已经编写好的函数和对象在被多个程序中使用时,不用把函数和对象拷贝到每个程序中. 模块支持以上功能,在Pyth ...
- WebForm、MVC图片加载失败处理
还是那个该死的WebFrom项目,部分功能替换为MVC后感觉好多了,但是WebForm.MVC都有图片加载失败时显示提示图片的需求,并且统一在js中处理.问题来了,js中图片路径怎么处理呢?现场有可能 ...
- MyEclipse异常关闭导致Tomcat不能启动的问题
由于MyEclipse的异常关闭从而导致Tomcat并没有关闭,所以再次启动Tomcat当然是无法启动的啦,解决方法:在任务管理器中关闭一个叫javaw.exe的进程,如果你这时已经启动了MyEcli ...
- .NET类库
1.如何让发布的C#的DLL类库中的方法带有注释说明 一个类库让第三方引用时,默认情况下生成类库时不携带注释,所以别人引用这个类库时就不是很方便理解类方法的作用和每个参数的含义,若是能携带方法的说明注 ...
- vbs命令1
MsgBox "兄弟呀,你最近是否失眠",vbinformation Randomize() Dim a a=Int(rnd*2) Select Case a Case 0 Msg ...
- java I/O进程控制,重定向 演示样例代码
java I/O进程控制,重定向 演示样例代码 package org.rui.io.util; import java.io.*; /** * 标准I/O重定向 */ public class Re ...