前言
Whitebox
可以用于方便的访问类内部的各种字段和方法,是一个简单实用的基于反射的单元测试工具类。本篇文章将对Whitebox
的常用方法进行介绍。关于使用PowerMock
需要引入哪些依赖,请参考PowerMock使用-依赖准备。
正文
一. 设置对象私有字段
使用Whitebox
可以方便的设置对象(静态)私有字段值。被测试类如下所示。
public class WhiteboxHelp {
private boolean flag = true;
public boolean isTrue() {
return flag;
}
}
被测试类WhiteboxHelp
有一个私有字段flag,同时WhiteboxHelp
的isTrue()
方法会返回flag的值。测试类如下所示。
public class PowerMockTest {
@Test
public void whiteboxPrivateField() {
WhiteboxHelp whiteboxHelp = new WhiteboxHelp();
Whitebox.setInternalState(whiteboxHelp, "flag", false);
assertThat(whiteboxHelp.isTrue(), is(false));
}
}
仅使用Whitebox
时不需要添加@RunWith
和@PrepareForTest
注解,同时对于上面例子如果flag是静态变量,那么设置静态变量值时需要使用Whitebox.setInternalState(WhiteboxHelp.class, "flag", false)
。
特别注意:如果WhiteboxHelp
的flag字段是静态的,则无法使用Whitebox
设置flag字段的值。
二. 调用私有方法
使用Whitebox
也可以方便的调用对象(静态)私有方法。被测试类如下所示。
public class WhiteboxHelp {
private boolean isTrue() {
return true;
}
}
测试类如下所示。文章来源:https://uudwc.com/A/ZGkyA
public class PowerMockTest {
@Test
public void whiteboxPrivateMethod() throws Exception {
WhiteboxHelp whiteboxHelp = new WhiteboxHelp();
assertThat(Whitebox.invokeMethod(whiteboxHelp, "isTrue"), is(true));
}
}
对于上面例子,如果isTrue()
是静态私有方法,那么调用静态私有方法时的语句为:assertThat(Whitebox.invokeMethod(WhiteboxHelp.class, "isTrue"), is(true))
。文章来源地址https://uudwc.com/A/ZGkyA