使用PowerMockito和Mockito进行模拟测试,包括静态方法测试,私有方法测试等
Posted houzheng
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用PowerMockito和Mockito进行模拟测试,包括静态方法测试,私有方法测试等相关的知识,希望对你有一定的参考价值。
依赖:这个很重要,不同版本用法也有点区别:
<dependency> <groupId>org.mockito</groupId> <artifactId>mockito-all</artifactId> <version>2.0.2-beta</version> <scope>test</scope> </dependency> <dependency> <groupId>org.powermock</groupId> <artifactId>powermock-api-mockito</artifactId> <version>1.7.4</version> <scope>test</scope> </dependency> <dependency> <groupId>org.powermock</groupId> <artifactId>powermock-module-junit4</artifactId> <version>2.0.0</version> <scope>test</scope> </dependency> <dependency> <groupId>org.powermock</groupId> <artifactId>powermock-core</artifactId> <version>1.7.4</version> <scope>test</scope> </dependency>
接下来就是mock测试了,使用完全模拟测试过程,对于需要测试接口中调用的静态,私有方法等,返回自己想要的预期结果,达到测试效果:
这里有几个要点:
测试过程中完全手动mock,不会真实调用或者产生数据
一 mock对象
order = mock(Order.class); user = mock(User.class);
二 属性注入
将service等类中需要的其他service或者mapper等mock出来,然后分别使用工具类注入,名称保持一致即可
roomTypeService = mock(RoomTypeServiceImpl.class); ticketComponetService = mock(TicketComponetServiceImpl.class); hotelMapper = mock(HotelMapper.class); //注入属性 ReflectionTestUtils.setField(orderService, "hotelGroupMapper", hotelGroupMapper); ReflectionTestUtils.setField(orderService, "dsUtils", dsUtils); ReflectionTestUtils.setField(orderService, "orderMapper", orderMapper);
三 静态方法mock
模拟静态方法返回结果需要使用PowerMockit
//account 获取stub PowerMockito.mockStatic(Account.class); Mockito.when(Account.get(anyString(), anyString(), anyString(), anyInt())).thenReturn(account);
四 私有方法mock
私有方法首先需要在类上加入注解:
@PrepareForTest(ConsumptionServiceImpl.class) //里面写需要模拟私有方法的类class
然后对象不能mock,必须new一个,并且需要用spy处理:
orderService = PowerMockito.spy(new OrderServiceImpl());
接着使用doreturn .when这种形式模式,不能使用先when后return这种,会报错
注意一点,模拟参数要么全部模拟,要么全部自定义,不能混搭
try {
// 方法名,方法参数,必须全部对应,否则报错方法找不到 PowerMockito.doReturn(1).when(orderService, "dateListMinBook",anyString(),anyString(),any(RoomType.class),anyString(),anyString()); PowerMockito.doReturn(ResponseMessage.success().pushData("dateRoomTypeList",new ArrayList<DateRoomType>())).when(orderService, "eachDateNumAndPrice",any(Order.class),any(RoomType.class),anyBoolean(),anyInt(),anyString(),any(User.class)); PowerMockito.doReturn("2000").when(orderService, "getKeeptimeByWxcidAndHotelidAndLevel",anyString(),anyString(),anyString()); PowerMockito.doNothing().when(orderService, "getPayWay",any(),any(),any(),any(),any()); } catch (Exception e) { e.printStackTrace(); }
五 预期结果
verify :判断方法执行了几次: 确定测试是否通过
例如:
verify(userService, times(1)).queryUser(any(anyInt(),anyString(),anyString());
以上是关于使用PowerMockito和Mockito进行模拟测试,包括静态方法测试,私有方法测试等的主要内容,如果未能解决你的问题,请参考以下文章
Mockito / PowerMockito每次在不同实例的循环中模拟静态方法?