首页 > 其他 > 详细

Unit Test PowerMock使用技巧

时间:2021-04-30 14:56:03      阅读:25      评论:0      收藏:0      [点我收藏+]

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的类名

在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...\)不做真实调用

Unit Test PowerMock使用技巧

原文:https://www.cnblogs.com/Yuzao/p/14721438.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!