您的位置:首页 > 其它

mock测试之powermock

2015-10-30 12:59 295 查看

导入相关jar

<dependency>

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

PowerMock介绍与使用

一、为什么要使用Mock工具

在做单元测试的时候,我们会发现我们要测试的方法会引用很多外部依赖的对象,比如:(发送邮件,网络通讯,远程服务, 文件系统等等)。 而我们没法控制这些外部依赖的对象,为了解决这个问题,我们就需要用到Mock工具来模拟这些外部依赖的对象,来完成单元测试。

二、为什么要使用PowerMock

现如今比较流行的Mock工具如jMock EasyMockMockito等都有一个共同的缺点:不能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);

}

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: