[英]JUnit and and Reflection : changing a private static final not working
我要測試某些課程及其行為。
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,它使用 JUnit 來測試恢復方法
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);
}
}
}
該測試用例實際上不起作用,因為實例未通過反射更改為相應的子 class。
在調試時我找不到任何相關的發現。
為什么這里不通過反射改變實例?
提前致謝。
您需要(通過反射)獲取 Field 的 FieldAccessor,並(通過反射)將其屬性“isReadOnly”更改為 false。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.