zoukankan      html  css  js  c++  java
  • Unit Test PowerMock使用技巧

    Mock 普通方法

    假设要Mock (Properties.class) 中的 (getProperty) 方法
    思路是先Mock一个对象,然后再修改该对象中的某个方法,然后再通过反射将原(Properties)对象替换为Mock的对象。

    Properties configProperties = PowerMockito.mock(Properties.class);
    PowerMockito.when(configProperties.getProperty("platform")).thenReturn("cm");
    Field field = MongoConfigService.class.getDeclaredField("configProperties");
    field.setAccessible(true);
    field.set(mongoConfigService, configProperties);
    

    Mock static method

    能够Mock静态方法,是PowerMock相对于mockito 的优势,PowerMock有自己写的runner,Mock静态方法时,通过使用PowerMockRunner进行运行可以修改静态方法。
    假设我们要Mock (InitAllService) 类中的静态方法
    首先要在测试类前加上:

    @RunWith(PowerMockRunner.class)           //代表该测试类用PowerMockRunner启动
    @PrepareForTest({InitAllService.class})   //下面会解释
    

    在Mock时,需要先mockStatic再次指定Mock类名,然后spy方法类似于Mock,但又有许多不同,在后面会介绍这两者的区别。
    doAnswer...when是修改 (InitAllService.getService) 方法

    PowerMockito.mockStatic(InitAllService.class);
    PowerMockito.spy(InitAllService.class);
    PowerMockito.doAnswer(invocation -> {
         Object[] args = invocation.getArguments();
         return new FakeIndividualServiceImpl();
    }).when(InitAllService.class, "getService", IndividualServiceImpl.class);
    

    细节

    spy和mock的区别

    mock方法和spy方法都可以对对象进行mock。但是前者是接管了对象的全部方法,而后者只是将有桩实现(stubbing)的调用进行mock,其余方法仍然是实际调用。
    意思是mock是产生一个新对象,该对象不含有原对象所含有的代码,只含有mock的方法
    而spy产生的对象则含有原对象的所有方法,但mock的方法会被优先调用。
    使用 (when...thenCallRealMethod) 可以访问到原对象的方法。

    doAnswer...when 和 when...thenAnswer的区别

    (when...thenAnswer...)做了真实调用。只是返回了指定的结果
    (doAnswer... when...)不做真实调用

    关于PrepareForTest的理解

    这里面填写的class并不一定是你要Mock的对象。
    填在里面的class代表你想通过修改哪个类的字节码来达到Mock的效果
    例如我想mock (System.currentTimeMillis()) , 但是该方法是native的,因此就不能修改System里面字节码。
    因此PrepareForTest里面就应该写调用 (System.currentTimeMillis()) 这个方法的class(例如某个Service),通过修改这个类里面的字节码来达到Mock currentTimeMillis 这个方法的效果。

    @PrepareForTest({xxxService.class})
    
  • 相关阅读:
    Docker-Compose搭建单体SkyWalking 6.2
    Docker搭建MySQL主从集群,基于GTID
    【简记】修改Docker数据目录位置,包含镜像位置
    【拆分版】Docker-compose构建Kibana单实例,基于7.1.0
    【拆分版】Docker-compose构建Logstash多实例,基于7.1.0
    【拆分版】Docker-compose构建Zookeeper集群管理Kafka集群
    命令行模式和python交互模式
    详解 HTTPS、TLS、SSL、HTTP区别和关系
    windows下如何查看进程、端口占用、杀死进程教程
    pycharm最常用的快捷键总结
  • 原文地址:https://www.cnblogs.com/Yuzao/p/14721438.html
Copyright © 2011-2022 走看看