使用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每次在不同实例的循环中模拟静态方法?

Mockito/PowerMockito踩坑记录

Mockito和PowerMock用法

记Cucumber行为驱动测试的简单配置与使用方式

我们可以使用Mockito和PowerMock出售junit测试类

Mockito的参数匹配