Junit测试案例几种特殊情况 | 进阶篇

本文介绍了Junit测试中遇到的复杂情况,如静态方法、private方法、内部new对象和void方法的模拟。通过PowerMock工具和重写类的方法,详细阐述了解决这些问题的策略,包括使用mockStatic、whenNew、doNothing以及反射等技术,帮助提升Junit测试的覆盖率。
摘要由CSDN通过智能技术生成

本文针对Junit测试案例编写中碰到的几种复杂情况给出解决方法,属于进阶使用,不介绍基础的Junit运用


Junit案例

说明:Junit是持续集成用得最广泛的工具之一,基础部分不展开描述,本文针对junit几种特殊情况,进阶使用PowerMock工具解决测试案例难题


一、PowerMock工具

说明:正常的if分支和模拟数据,通过Mock工具就可以完成了,但Mock没办法模拟很多复杂的情景,比如私有方法、静态方法的引用,被测试类的new对象等等。
此时就需要引入功能更强大的PowerMock工具,实现各种复杂场景下的分支覆盖。

下面是几种常见的特殊案例:

1.静态方法

案例:

package junit.ding.test;

import junit.ding.util.DemoUtil;

public class Demo {
   
	public String fun1(){
   
		//这里引用了DemoUtil的静态方法
		//测试fun1时需要屏蔽这个方法
		String str = DemoUtil.getStr();
		return str;
	}
}

junit测试案例:

静态方法无法直接通过PowerMockito.when来实现屏蔽,但可以先调用PowerMockito.mockStatic方法,在底层对类属性进行修改。

案例如下,调用mockStatic之前先实现注解
@RunWith(PowerMockRunner.class)
@PrepareForTest({DemoUtil.class})

package junit.ding.test;

import junit.ding.test.Demo;
import junit.ding.util.DemoUtil;

import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PowerMockIgnore;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;

@RunWith(PowerMockRunner.class)
@PrepareForTest({
   
	DemoUtil.class
})
@PowerMockIgnore("javax.management.*")
public class DemoTest {
   
	@Test
	public void testFun1() {
   
		Demo demo = new Demo();
		PowerMockito.mockStatic(DemoUtil.class);
		PowerMockito.when(DemoUtil.getStr()).thenReturn("Test");
		Assert.assertEquals("Test", demo.fun1());
	}
}

2.private方法

private禁止被外部类访问,所以测试案例最典型的难题就是Test类无法屏蔽被测试类的内部private或父类private方法。

案例:需要测试fun,但是fun内部调用了add方法,add方法为private权限,无法被外部Test类调用,即无法显式地mock出来。

package junit.ding.test;

public class Demo {
   
	public int fun(int i){
   
		i = 1;
		return add(i);
	}
	
	pri
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值