由于公司框架依赖别的模块, 导致我们开发老是需要跟着他们的脚步, 所以我的上级领导提出这个方案说直接跳过他们,我们自己在本地测试,然后就找了它,
导入相关jar<dependency>PowerMock介绍与使用
<groupId>org.powermock</groupId>
<artifactId>powermock-api-mockito</artifactId>
<version>1.4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-all</artifactId>
<version>1.8.5</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-module-junit4</artifactId>
<version>1.4.12</version>
<scope>test</scope>
</dependency>
一、为什么要使用Mock工具
在做单元测试的时候,我们会发现我们要测试的方法会引用很多外部依赖的对象,比如:(发送邮件,网络通讯,远程服务, 文件系统等等)。
而我们没法控制这些外部依赖的对象,为了解决这个问题,我们就需要用到Mock工具来模拟这些外部依赖的对象,来完成单元测试。
二、为什么要使用PowerMock
现如今比较流行的Mock工具如jMock、EasyMock 、Mockito等都有一个共同的缺点:不能mock静态、final、私有方法等。
而PowerMock能够完美的弥补以上三个Mock工具的不足。
三、PowerMock简介
PowerMock是一个扩展了其它如EasyMock等mock框架的、功能更加强大的框架。
PowerMock使用一个自定义类加载器和字节码 *** 作来模拟静态方法,构造函数,final类和方法,私有方法,去除静态初始化器等等。
通过使用自定义的类加载器,简化采用的IDE或持续集成服务器不需要做任何改变。
熟悉PowerMock支持的mock框架的开发人员会发现PowerMock很容易使用,因为对于静态方法和构造器来说,整个的期望API是一样的。
PowerMock旨在用少量的方法和注解扩展现有的API来实现额外的功能。
目前PowerMock支持EasyMock和Mockito。
四、PowerMock入门
PowerMock有两个重要的注解:
–@RunWith(PowerMockRunner.class)
–@PrepareForTest( { YourClassWithEgStaticMethod.class })
如果你的测试用例里没有使用注解@PrepareForTest,那么可以不用加注解@RunWith(PowerMockRunner.class),反之亦然。
当你需要使用PowerMock强大功能(Mock静态、final、私有方法等)的时候,就需要加注解@PrepareForTest。
五、PowerMock基本用法
PowerMock时要使用PowerMock强大功能(Mock静态、final、私有方法等)的时候,需要使用@RunWith(PowerMockRunner.class)
@PrepareForTest( { YourClassWithEgStaticMethod.class })表示的是要测试的类,这个里面调用了静态类
例子:
这个类里面的方法调用了需要mock类的方法
public class BussMana { public List<String> getList(){ System.out.println("调用~~~~"); return Interface.getList();//Interface是需要mock的类 } public String getStr(){ return Interface.getString(); } }
这个类是需要mock的类
public class Interface { public static List<String> getList() { System.out.println("调用 ZK"); return new ArrayList<String>(); } public static String getString() { return "nome"; } }
测试类
@RunWith(PowerMockRunner.class) @PrepareForTest({Interface.class})//要测试的类,这个里面调用了静态类 public class BussManaTest { static{ PowerMockito.mockStatic(Interface.class); }; public BussManaTest(){ } @Test public void test() { //mock调用ZK的类 List<String> list = new ArrayList<String>(); list.add("123"); list.add("1234"); list.add("1235"); try { //声明调用ZK时返回自己想要的值 PowerMockito.when(Interface.getList()).thenReturn(list); } catch (Exception e) { e.printStackTrace(); } BussMana bm = new BussMana(); //调用方法,方法里面调用了ZK,这里返回的时上面期望的返回值 List<String> result = bm.getList(); for (String str : result) { System.out.println(str); } } }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)