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. widow系统 LuaForWindows,安装 luasocket

    参考 http://94it.net/a/jingxuanboke/2013/0625/49052.html 1. 我用的是 LuaForWindows_v5.1.4-46.exe 可以在我的百度网盘 ...

  2. (转) MapReduce Design Patterns(chapter 2 (part 1))(二)

     CHAPTER 2 .Summarization Patterns 随着每天都有更多的数据加载进系统,数据量变得很庞大.这一章专注于对你的数据顶层的,概括性意见的设计模式,从而使你能扩展思路,但可能 ...

  3. mysql动态扩容调研

    MySQL动态扩容方案 目前可用方案 MySQL的复制: 一个Master数据库,多个Salve,然后利用MySQL的异步复制能力实现读写分离,这个方案目前应用比较广泛,这种技术对于以读为主的应用很有 ...

  4. css 发光样式

    结果: css/style1.css: /*setup*/ *{ margin:; padding:; } @font-face { font-family: 'Monoton'; font-styl ...

  5. SQL 添加删除列

    --添加一列 alter table TableName add columnName columnType --删除表中的一列 alter table TableName drop column c ...

  6. linux远程win7教程

    http://jingyan.baidu.com/article/c275f6bacd2227e33c756754.html 1 在ubuntu下搜索Remmina(超级方便,应该也可以控制linux ...

  7. c# mysql and sqlserver数据库连接字符串

    .net 项目访问sqlserver 和mysql 两种数据库时,连接字符串有些不一样 具体配置如下 <connectionStrings> <add name="mysq ...

  8. apply函数应用

    (1)找到数组中最小或最大的数字 var v = [1,23,4,9]; console.log(Math.min.apply(Math,v));

  9. WPF 绘制对齐像素的清晰显示的线条

    此前有小伙伴询问我为何他 1 像素的线条显示发虚,然后我告诉他是“像素对齐”的问题,然而他设置了各种对齐像素的属性依旧没有作用.于是我对此进行了一系列试验,对 WPF 像素对齐的各种方法进行了一次总结 ...

  10. ORACLE PL/SQL:触发器

    ORACLE PL/SQL 触发器 本篇主要内容如下: 8.1 触发器类型 8.1.1 DML触发器 8.1.2 替代触发器 8.1.3 系统触发器 8.2 创建触发器 8.2.1 触发器触发次序 8 ...