问题描述
我正在测试某些类及其行为。
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。
对不起,如果没有代码,我是用手机写的。 稍后我将发布代码