Java单体测试static final值修改

测试目标代码

public Class Temp {
private static final boolean VAULE = true;
public testFunc() {
	if (VAULE) {
		...;
	}
}
}

通常测试测试VAULE值为true,但是测试值一致测试不到false分支,客户要求分支达到一定程度,现在需要将VAULE值设置为false,设置方法如下:

测试代码

 @Test
 public void test_Temp_testFunc_VAULE_false() {
	Temp obj = new Temp();
	Field valueField = Temp.class.getDeclaredField("VAULE");  //通过反射获取Field对象
	valueField.setAccessible(true);  //值为 true 则指示反射的对象在使用时应该取消 Java 语言访问检查,提升测试速度
	Field modifiers = valueField .getClass().getDeclaredField("accessFlags");  // 根据源码查看android9的内容(原本变量为modifiers),获取到accessFlags,来设置其final属性是否取消
	modifiers.setAccessible(true);
	modifiers.setInt(valueField , valueField .getModifiers() & ~Modifier.FINAL);  // 取消final属性
	valueField.set(null, false);
	modifiers.setInt(valueField , valueField .getModifiers() & ~Modifier.FINAL);  //重新设置上变量的final属性,为了保证后续内容不可预期发生
	obj.testFunc();  //调用测试代码
}

其它注意事项

为了保证原本代码逻辑的合理性,建议在setUp中重新复归

@Before
public void setUp() { // 每次执行代码顺序为 @Before->@Test->@After
	Temp obj = new Temp();
	Field valueField = Temp.class.getDeclaredField("VAULE");
	valueField.setAccessible(true);
	Field modifiers = valueField .getClass().getDeclaredField("accessFlags");
	modifiers.setAccessible(true);
	modifiers.setInt(valueField , valueField .getModifiers() & ~Modifier.FINAL);
	valueField.set(null, true);
	modifiers.setInt(valueField , valueField .getModifiers() & ~Modifier.FINAL);
}

为了使测试代码具有更高的复用性可阅读性,建议将测试变量名命名函数规范,不要采用数字后缀的方式,便于后续观察代码时知道测试代码走到了那个逻辑分支。

以上描述存在问题和知识点不足的地方欢迎指正和探讨~

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值