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