Powermockito和Mockito测试框架分析以及一个简单的脚手架+单测的注意事项

1.Powermockito和Mockito是什么?

Mocktio和PowerMockito都是Mock的工具类,主要是Java的类库,Mock就是伪装的意思。

他们适用于单元测试中,对于单元测试来说,我们不希望依赖于第三方的组件,比如数据库、Webservice等。在写单元测试的时候,我们如果遇到了这些需要依赖第三方的情况,我们可以使用Mock的技术,伪造出来我们自己想要的结果。

对于Java而言,mock的对象主要是Java 方法和 Java类。

2.Powermockito和Mockito的区别

PowerMockito是Mockito的一种增强,他们的PowerMockito可以调用Mockito的方法,但是对于Mocktio不能Mock的对象或者方法,我们可以使用PowerMockito来实现。

比如Mockito不能用于static Method, final method, 枚举类, private method,这些我们都可以用PowerMockito来实现,当PowerMockito和mockito结合使用的时候,我们需要考虑兼容性的问题。

3.两者的版本兼容

MockitoPowerMockito
2.8.9+2.x
2.8.0-2.8.91.7.x
2.7.51.7.0RC4
2.4.01.7.0RC2
2.0.0-beta - 2.0.42-beta1.6.5-1.7.0RC
1.10.8 - 1.10.x1.6.2 - 2.0
1.9.5-rc1 - 1.9.51.5.0 - 1.5.6
1.9.0-rc1 & 1.9.01.4.10 - 1.4.12
1.8.51.3.9 - 1.4.9
1.8.41.3.7 & 1.3.8
1.8.31.3.6
1.8.1 & 1.8.21.3.5
1.81.3
1.71.2.5
附上对应github地址:mock

4.Powermockito和Mockito常用的一些语法和关键词

@RunWith(PowerMockRunner.class)代表使用的powerMock作为启动类
@PrepareForTest(Static.class)如果需要mock静态的方法和静态的类需要使用
@Mockmock修饰的类(类似于spring的@Resource),不会调用原方法
@Spy为现有的对象进行打桩(具体可以干啥,后面的博客会有介绍,这里只需要记住,这个比较常用即可),会调用原方法
@InjectMocks会将mock和spy的对象注入到InjectMocks修饰的类里面类似于spring的@Service,会调用原方法
any()参数解析器,用户给方法传参使用
PowerMockito.mockStatic(HttpClientUtils.class)PrepareForTest(Static.class) 一起使用,用于mock静态的类和方法
MockitoAnnotations.initMocks(this);初始化mock的对象
when(mockService.get(anyString()).thenReturn(1);真正进行mock的语法可以,可以理解为(当做了什么事情,然后得到了什么结果)
PowerMockito.doReturn(1).when(mockService).get(any());真正进行mock的语法可以,可以理解为(拿到什么结果,当做什么事情的时候)
Mockito.verify(mockService, Mockito.times(1)).get(any());这里是验证当前方法执行的次数

5.简单写一个mock单元测试的脚手架

@RunWith(PowerMockRunner.class)
public class MockServiceTest {
    @InjectMocks
    private MockService mockService;
    @Mock
    private MockDAO mockDAO;
    @Before
    public void init() {
        MockitoAnnotations.initMocks(this);
    }

    @Test
    public void testGetIOSAppDetailByParams() {
    	// Give
        long userId = 1l;
        long expectedUserId = 1l;
        
 		// When
 		PowerMockito.when(mockDAO.getById(anyLong())).thenReturn(new UserInfo());
        UserInfo user = mockService.getById(userId);
        
        // Then
        assertThat(user.getId()).isEqualTo(expectedUserId);
    }

}

5.使用mock进行单元测试的注意事项

  1. 单测代码不允许出行System.out.println();
  2. 单元测试必须是可重复、独立运行、自动化的
  3. 单元测试必须要有验证逻辑,也就是Then这个阶段,要不然就是快乐单测,没有实际用处
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

特特专属

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值