PowerMock模拟功能异常

第一章 PowerMock单元模拟测试框架简介

一 为什么要模拟异常呢?

在实际工作中,有时会碰到要求代码测试覆盖率要到达某个标准,刚好要执行完异常代码才能通过检测。解决办法在正常功能加运行时抛出异常显然不行,正式环境影响业务,通过使用PowerMock模拟异常, 可以在不影响业务,也不用修改代码情况下,测试到异常代码的执行情况。

二 PowerMock模拟功能异常使用方法

          PowerMockito.when().thenThrow();

三 PowerMock模拟异常实际的demo如下。

1 当看完下面的测试demo,会产生一些疑问。

1.1 PowerMockito.when().thenThrow();有什么作用,不用能通过?

此行代码作用向PowerMockito声明在某种情况下,抛出异常。不声明无法模拟异常。

1.2 OrderDao为什么使用PowerMockito创建实例而OrderService不用?

使用mock方法生成的实例,在执行时PowerMockito才能拦截,抛出异常。通过关键字new是无法,模拟异常的。

1.3 orderService.update();不调用,会触发异常执行?

只有调用orderService.update() 执行到orderDao.update(),PowerMockito拦截到就触发抛出异常。而且orderDao要通过mock函数创建。

package powerMock;

import org.junit.Test;
import org.powermock.api.mockito.PowerMockito;

import static org.junit.Assert.assertEquals;

public class TestOrderService {
    @Test
    public void testPublicMethodExcption(){
        OrderDao orderDao=PowerMockito.mock(OrderDao.class);
        OrderService  orderService=new OrderService(orderDao);
        PowerMockito.when(orderDao.update()).thenThrow(new RuntimeException("测试"));
        orderService.update();
    }
}

2 当碰到私有方法测试异常如何编写单元测试案例?

2.1 在OrderService增加私有函数update1()

package powerMock;

public class OrderService {
  private  OrderDao orderDao;
  public void setOrderDao(OrderDao orderDao) {
        this.orderDao = orderDao;
  }
  public OrderService(OrderDao orderDao) {
        this.orderDao = orderDao;
   }
  private int update1(){
      try{
          orderDao.update();
      }catch (Exception e){
          e.printStackTrace();
      }
      return 1;
  }
}

2.2 测试类添加私有函数测试

package powerMock;
import org.junit.Test;
import org.powermock.api.mockito.PowerMockito;
import static org.junit.Assert.assertEquals;

public class TestOrderService {

    @Test
    public void testPrivateMethodExcption(){
        OrderDao orderDao=PowerMockito.mock(OrderDao.class);
        OrderService  orderService=new OrderService(orderDao);
        OrderService  spy=PowerMockito.spy(orderService);
        try {
            PowerMockito.when(orderDao.update()).thenThrow(new RuntimeException("测试"));
            PowerMockito.when(spy, "update1",new Object[]{});
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

3 类的静态函数无参数无返回值异常模拟,单元测试如何编写?

3.1 OrderService增加静态函数无参无返回值

package powerMock;
import com.fast.common.core.utils.StringUtils;
public class OrderService {
  public static void inti(){
        try {
            StringUtils.isEmpty("");
        }catch (Exception e){
            e.printStackTrace();
        }
  }
}

3.2 TestOrderService 增加静态函数无参无返回值单元测试

package powerMock;
import com.fast.common.core.utils.StringUtils;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mockito;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import static org.junit.Assert.assertEquals;
@RunWith(PowerMockRunner.class)
@PrepareForTest({StringUtils.class})
public class TestOrderService {
    @Test
    public void testStaticFunc(){
        PowerMockito.mockStatic(StringUtils.class);
        PowerMockito.when(StringUtils.isEmpty(Mockito.anyString())).thenThrow(new RuntimeException("静态函数无参无返回值异常"));
        OrderService.inti();
    }
}

  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值