簡體   English   中英

JUnit and and Reflection: 更改私有 static final 不工作

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM