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);

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));
	}

}

原文地址:https://www.cnblogs.com/cowboys/p/9290950.html

时间: 2024-10-13 12:12:12

PowerMock单元测试的相关文章

java.lang.VerifyError 在使用PowerMock EasyMock进行单元测试

java.lang.VerifyError:Stack map does not match the one at exception handler 385 in method ... at offset 377 我使用的 jar包( 下面是认为跟这个问题有关系的jar包)如下: antrl-3.3-complete.jar cglib-2.2.jar cglib-nodep-2.2.2.jar easymock-3.2.jar mockito-all-1.9.5.jar persistent

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

转 单元测试及框架简介 --junit.jmock.mockito.powermock的简单使用 2013年08月28日 14:33:06 luvinahlc 阅读数:6413 标签: 测试工具单元测试Junit实例Mockito 更多 个人分类: 单元测试 推荐一个新手学习Junit4的博客地址:http://www.cnblogs.com/eggbucket/archive/2012/02/02/2335697.html        点击打开链接 一.单元测试 单元测试概念: 所谓MT(M

配置同时使用PowerMock和Robolectric对Android进行单元测试

Robolectric官网上给了一个配置教程,但是我使用它的方法进行配置,发现使用Mockito.spy函数的时候会出现Exception. 后来在PowerMock官网上找到了另外一个教程,里面说使用PowerMockRule是不靠谱的,要使用PowerMock 1.6.0引入的新的@PowerMockRunnerDelegate annotation来进行配置 具体配置文件如下: module里面的build.gradle添加依赖: dependencies { ...... testCom

用Powermock在单元测试中使用Swing会造成Swing观感类加载失败,有可能是Swing安全机制造成的

java.lang.VerifyError: (class: javax/swing/plaf/metal/MetalLookAndFeel, method: getLayoutStyle signature: ()Ljavax/swing/LayoutStyle;) Wrong return type in function at javax.swing.UIManager.setLookAndFeel(UIManager.java:554) at javax.swing.UIManager.

使用 Spring 进行单元测试

单元测试和集成测试在我们的软件开发整个流程中占有举足轻重的地位,一方面,程序员通过编写单元测试来验证自己程序的有效性,另外一方面,管理者通过持续自动的执行单元测试和分析单元测试的覆盖率等来确保软件本身的质量.这里,我们先不谈单元测试本身的重要性,对于目前大多数的基于 Java 的企业应用软件来说,Spring 已经成为了标准配置,一方面它实现了程序之间的低耦合度,另外也通过一些配置减少了企业软件集成的工作量,例如和 Hibernate.Struts 等的集成.那么,有个问题,在普遍使用 Spri

Android单元测试与模拟测试详解

测试与基本规范 为什么需要测试? 为了稳定性,能够明确的了解是否正确的完成开发. 更加易于维护,能够在修改代码后保证功能不被破坏. 集成一些工具,规范开发规范,使得代码更加稳定( 如通过 phabricator differential 发diff时提交需要执行的单元测试,在开发流程上就可以保证远端代码的稳定性). 2. 测什么? 一般单元测试: 列出想要测试覆盖的异常情况,进行验证. 性能测试. 模拟测试: 根据需求,测试用户真正在使用过程中,界面的反馈与显示以及一些依赖系统架构的组件的应用测

Java单元测试(Junit+Mock+代码覆盖率)

原文见此处 单元测试是编写测试代码,用来检测特定的.明确的.细颗粒的功能.单元测试并不一定保证程序功能是正确的,更不保证整体业务是准备的. 单元测试不仅仅用来保证当前代码的正确性,更重要的是用来保证代码修复.改进或重构之后的正确性. 一般来说,单元测试任务包括 接口功能测试:用来保证接口功能的正确性. 局部数据结构测试(不常用):用来保证接口中的数据结构是正确的 比如变量有无初始值 变量是否溢出 边界条件测试 变量没有赋值(即为NULL) 变量是数值(或字符) 主要边界:最小值,最大值,无穷大(

PowerMock简介

PowerMock 写单元测试可能有些难.有时仅仅为了可测试性的目标而不得不牺牲好的设计.通常可测试性和好的测试之间是一致的,但是并不总是如此.比如,由于现存框架的限制,final classes.methods不能被使用,private methods有时需要被保护或者没有必要移到协作者内(collaborator),static methods应当被完全避免等等. PowerMock是一个扩展了其他mock libraries(比如EasyMock)的框架,拥有更强大的功能.PowerMoc

PowerMock测试

EasyMock可以满足单元测试中的大部分需求,但是由于动态代理是使用了面向对象的继承和多态特性,JDK自身的动态代理只针对接口进行代理,其本质是为接口生成一个实现类,而CGLIB可以针对类进行代理,其本质是将类自身作为基类. 如果遇到了静态.final类型的类和方法,以及私有方法,EasyMock的动态代理局限性使得无法测试这些特性情况. PowerMock是在EasyMock基础上进行扩展(只是补充,不是替代),使用了字节码操作技术直接对生成的字节码类文件进行修改,从而可以方便对静态,fin