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单元测试的更多相关文章

  1. PowerMock单元测试踩坑与总结

    1.Mock是什么? 通过提供定制的类加载器以及一些字节码篡改技巧的应用,PowerMock 现了对静态方法.构造方法.私有方法以及 Final 方法的模拟支持,对静态初始化过程的移除等强大的功能. ...

  2. powermock单元测试小结

    最近时不时的需要单元测试来写覆盖率.简单总结一下日常心得: 1.首先指明需要测试的类:@PrepareForTest({ RewardGoldServiceImpl.class }) 2.其次在测试类 ...

  3. 使用MRUnit,Mockito和PowerMock进行Hadoop MapReduce作业的单元测试

    0.preliminary 环境搭建 Setup development environment Download the latest version of MRUnit jar from Apac ...

  4. 使用Powermock进行单元测试,以及常见问题的处理

    1. 引言 在进行单元测试时,经常遇到被测方法依赖外部对象和环境,如需要数据库连接,网络通信依赖等,需要进行大量的初始化工作,这时可以采用powermock+mockito对被测对象进行模拟,通过录放 ...

  5. 单元测试不是梦,Android+PowerMock系列(1) —— 在Eclipse里搭建测试环境

    单元测试不好搞阿,虽然从TDD角度出发,可测性强的代码很大程度上就代表着好的设计,但是有些情况也是没办法的,比如单例模式,比如Static方法,比如Final类,传统的Mock技术是没办法解决这些问题 ...

  6. Spring Boot 2 实践记录之 封装依赖及尽可能不创建静态方法以避免在 Service 和 Controller 的单元测试中使用 Powermock

    在前面的文章中(Spring Boot 2 实践记录之 Powermock 和 SpringBootTest)提到了使用 Powermock 结合 SpringBootTest.WebMvcTest ...

  7. Spring Boot 2 实践记录之 使用 Powermock、Mockito 对 UUID 进行 mock 单元测试

    由于注册时,需要对输入的密码进行加密,使用到了 UUID.sha1.md 等算法.在单元测试时,使用到了 Powermock,记录如下. 先看下加密算法: import org.apache.comm ...

  8. dubbo应用程序的单元测试环境搭建(springtest,powermock,mockito)

    转:http://blog.csdn.net/yys79/article/details/66472797 最近,项目中频繁用到dubbo,而且java工程用引用了几十个关联系统的服务(如用户认证,基 ...

  9. 单元测试及框架简介 --junit、jmock、mockito、powermock的简单使用

    转 单元测试及框架简介 --junit.jmock.mockito.powermock的简单使用 2013年08月28日 14:33:06 luvinahlc 阅读数:6413 标签: 测试工具单元测 ...

随机推荐

  1. java作业调度框架Quartz

    在软件开发中,很多时候需要在特定时间的时间执行某些操作,比如每天的凌晨三点.每周的周日.每个月的15号,Apache Quartz就是一个开源的作业调度框架,可以让计划的程序任务一个预定义的日期和时间 ...

  2. EasyDSS RTMP流媒体服务器videojs flash播放RTMP/HLS提示错误的解决方案

    本文转自EasyDSS团队成员StarIT的博客:http://blog.csdn.net/staritstarit/article/details/73692715 问题 在博客<EasyDS ...

  3. CSS样式让元素填充剩余部分为自己的高度或宽度

    #nav {     background-color: #85d989;     width: 100%;     height: 50px; } #content {     background ...

  4. Graham扫描法

    Graham扫描法求凸包的模板 运行之后可以得到存有凸包顶点的栈s和栈顶指针top,n代表总点数 这个模板我当时调了很久,主要难点有两个,一个是正确的极角排序,一个是出栈入栈的细节操作,逆时针扫描,这 ...

  5. dhcp snooping、ARP防护、

    应用场景 无线客户端流动性很大和不确定,比如在外来人员比较多的地方:广场.大厅.会议室和接待室等等.使用该方案可以有效地避免因为无线端出现私设IP地址导致地址冲突或者客户端中ARP病毒发起ARP攻击的 ...

  6. Codeforces 808G Anthem of Berland【KMP】【DP】

    LINK 简要题意 给你一个串s,上面有字母和一些通配符,问你将通配符换成字母之后最多可以出现多少次串t 首先有一个很傻子的做法就是\(dp_{i,j}\)表示s到第i个位置匹配t串前j个字符的完整t ...

  7. java基础:eclipse编程不得不知道的技巧

    如果你是位具有开发经丰富的工程师,在开发的过程中,你就会很强烈的要求快捷的编程.如何快捷编程,只有更加熟悉开发工具.那么eclipse是同样也有很多技巧.可以带着下面问题来阅读1.如何查找类相关信息? ...

  8. JavaScript中字符串截取函数slice()、substring()、substr()

    在js中字符截取函数有常用的三个slice().substring().substr()了,下面我来给大家介绍slice().substring().substr()函数在字符截取时的一些用法与区别吧 ...

  9. 通过Excel生成批量SQL语句,处理大量数据的好办法

    我们经常会遇到这样的要求:用户给发过来一些数据,要我们直接给存放到数据库里面,有的是Insert,有的是Update等等,少量的数据我们可以采取最原始的办法,也就是在SQL里面用Insert into ...

  10. POJ1220 Number Base Conversion

    题意 Write a program to convert numbers in one base to numbers in a second base. There are 62 differen ...