微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

JUnit 和和反射:更改私有静态最终不起作用

如何解决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();
        }
    }
}

我有一个使用 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);              
          }
     }
}

这个测试用例实际上不起作用,因为实例没有通过反射更改为相应的子类。

在调试时我找不到任何相关的发现。

为什么这里不通过反射改变实例?

提前致谢。

解决方法

您需要(通过反射)获取 Field 的 FieldAccessor,并(通过反射)将其属性“isReadOnly”更改为 false。

对不起,如果没有代码,我是用手机写的。 稍后我将发布代码

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。