如何解决JUnit 和和反射:更改私有静态最终不起作用
我正在测试某些类及其行为。
class Work {
private static final INSTANCE = new Work();
protected Work() {
}
public Work getInstance() {
return INSTANCE;
}
public void firstWork() throws Exception {
// do something
}
public void secondWork() throws Exception {
// do something
}
public void thirdWork() throws Exception {
// do something
}
public void revertFirstWork() throws Exception {
// do something
}
public void revertSecondWork() throws Exception {
// do something
}
}
class Manager {
public Manager() {
}
public void doWorks() {
Work work = Work.getInstance();
work.firstWork();
try {
work.secondWork();
} catch(Exception e) {
work.revertSecondWork();
}
try {
work.thirdWork();
} catch(Exception e) {
work.revertFirstWork();
work.revertSecondWork();
}
}
}
class MyTest {
private void setWorkUsingReflection(Work work) {
Field field = Work.class.getDeclaredField("INSTANCE");
field.setAccessible(true);
Field modifiersField = Field.class.getDeclaredField("modifiers");
modifiersField.setAccessible(true);
modifiersField.set(field,field.getModifiers() & ~Modifier.FINAL);
field.set(null,work);
}
@Test
public void testRevertFirstWork() {
class RevertFirstWork extends Work {
RevertFirstWork() {
super();
}
@Override
public void secondWork() throws Exception {
throws new Exception("KNown Exception");
}
}
Work work = Work.getInstance();
try {
Manager manager = new Manager();
setWorkUsingReflection(new RevertFirstWork());
manager.doWorks();
} finally {
setWorkUsingReflection(work);
}
}
@Test
public void testRevertFirstAndSecondWork() {
class RevertFirstAndSecondWork extends Work {
RevertFirstWork() {
super();
}
@Override
public void thirdWork() throws Exception {
throws new Exception("KNown Exception");
}
}
Work work = Work.getInstance();
try {
Manager manager = new Manager();
setWorkUsingReflection(new RevertFirstAndSecondWork());
manager.doWorks();
} finally {
setWorkUsingReflection(work);
}
}
}
这个测试用例实际上不起作用,因为实例没有通过反射更改为相应的子类。
在调试时我找不到任何相关的发现。
为什么这里不通过反射改变实例?
提前致谢。
解决方法
您需要(通过反射)获取 Field 的 FieldAccessor,并(通过反射)将其属性“isReadOnly”更改为 false。
对不起,如果没有代码,我是用手机写的。 稍后我将发布代码
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。