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