码迷,mamicode.com
首页 > 其他好文 > 详细

使用PowerMockito和Mockito进行模拟测试,包括静态方法测试,私有方法测试等

时间:2019-04-16 14:45:59      阅读:1057      评论:0      收藏:0      [点我收藏+]

标签:注意   不同   book   trace   产生   enc   ice   junit4   属性注入   

依赖:这个很重要,不同版本用法也有点区别:

		<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进行模拟测试,包括静态方法测试,私有方法测试等

标签:注意   不同   book   trace   产生   enc   ice   junit4   属性注入   

原文地址:https://www.cnblogs.com/houzheng/p/10716684.html

(0)
(6)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!