mock测试之powermock

半城伤御伤魂 提交于 2019-12-10 02:40:45

由于公司框架依赖别的模块, 导致我们开发老是需要跟着他们的脚步, 所以我的上级领导提出这个方案说直接跳过他们,我们自己在本地测试,然后就找了它,

导入相关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 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);

      }

   }

}

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!