PowerMock模拟功能异常

PowerMock模拟功能异常

1 年前

第一章 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(){
          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