美文网首页
Mockito+Powermock 单元测试简单使用说明

Mockito+Powermock 单元测试简单使用说明

作者: masterFan | 来源:发表于2019-01-07 15:05 被阅读0次

    说明

    提供几个简单的例子,说明如何利用Mockito + Powermock来做单元测试

    一、POM 依赖

    <mockito.version>1.10.19</mockito.version>
    <powermock.version>1.7.0</powermock.version>
    
    <dependency>
        <groupId>org.powermock</groupId>
        <artifactId>powermock-api-mockito</artifactId>
        <version>${powermock.version}</version>
        <scope>test</scope>
    </dependency>
    
    <dependency>
        <groupId>org.powermock</groupId>
        <artifactId>powermock-module-junit4</artifactId>
        <version>${powermock.version}</version>
        <scope>test</scope>
    </dependency>
    
    <dependency>
        <groupId>org.powermock</groupId>
        <artifactId>powermock-module-junit4-rule-agent</artifactId>
        <version>${powermock.version}</version>
        <scope>test</scope>
    </dependency>
    

    这里mockito 使用1.x版本,powermock使用1.7.0.

    二、Mockito+Powermock 实例

    普通service方法

    public class StoreServiceImpl implements StoreService {
    
    private OrderDetailMapper detailMapper;
    
    private OfflineOrderReasonService offlineOrderReasonService;
    
    public int insertOrderDetail(OrderDetail orderDetail) {
            int id = 0;
            try {
                id = detailMapper.insert(orderDetail);
            } catch (Exception e) {
                OfflineOrderReasonDO reasonDO = this.convertTo(orderDetail,2,"插入订单信息异常");
                offlineOrderReasonService.saveOfflineOrderReason(reasonDO);
                LoggerUtil.error(logger, "[INSERT_ORDER_FAIL] msg=orderNo:"+orderDetail.getOrderNo(),"errorMsg:"+e.getMessage(),e);
            }
            return id;
        }
    
    }
    

    单元测试

    第一步 告诉junit使用PowerMockRunner执行单元测试
    @RunWith(PowerMockRunner.class)
    public class StoreServiceImplTest{
    
    
    第二步 利用注解mock对象

    @InjectMocks:添加了该注解的对象的方法是可以进入,被执行的
    @Mock:添加了该注解的对象所有的属性和方法都是不可使用的

      @InjectMocks
        StoreServiceImpl storeService;
       @Mock
        private OrderDetailMapper detailMapper;
    
    第三步 初始化mock对象
       @Before
        public void setUp() {
            // 对定义了注解对象进行初始化
            MockitoAnnotations.initMocks(this);
            prepareData();
        }
    
    第四步 编写test方法
    方法 说明
    方法 说明
    PowerMockito.when(方法).thenReturn(预期返回值) 模拟方法返回特定预期的返回值
    PowerMockito.when(方法).thenThrow(异常) 模拟方法执行中抛出异常
        @Test
        public void insertOrderDetailTest() {
            PowerMockito.when(detailMapper.insert(orderDetail)).thenReturn(1);
    
            int id = storeService.insertOrderDetail(orderDetail);
    
            // 验证是否进入了detailMapper.insert
            Mockito.verify(detailMapper).insert(orderDetail);
            // 验证返回是否正确
            Assert.assertEquals(1,id);
        }
    
       @Test
        public void insertOrderDetailWithExceptionTest() {
            // 执行方法时抛异常
            PowerMockito.when(detailMapper.insert(Mockito.any())).thenThrow(new NullPointerException());
            // void的方法
            PowerMockito.doNothing().when(offlineOrderReasonService).saveOfflineOrderReason(Mockito.any());
    
            int id = storeService.insertOrderDetail(orderDetail);
    
            Assert.assertEquals(0,id);
        }
    

    相关文章

      网友评论

          本文标题:Mockito+Powermock 单元测试简单使用说明

          本文链接:https://www.haomeiwen.com/subject/wyssrqtx.html