Mock private static final field using mockito or Jmockit

前端 未结 4 1129
感情败类
感情败类 2020-12-05 09:31

I am using private static final LOGGER field in my class and I want LOGGER.isInfoEnabled() method to return false. How can

4条回答
  •  广开言路
    2020-12-05 09:50

    One way is using reflection get rid of final modifier from the field and then replace the LOGGER field with Mocked one

    public class Class1Test {
        @Test
        public void test() throws Exception {
            Logger logger = Mockito.mock(Logger.class);
            Mockito.when(logger.isInfoEnabled()).thenReturn(false);
            setFinalStatic(Class1.class.getDeclaredField("LOGGER"), logger);
            Class1 cls1 = new Class1();
            assertFalse(cls1.demoMethod());
        }
    
        static void setFinalStatic(Field field, Object newValue) throws Exception {
            field.setAccessible(true);        
            Field modifiersField = Field.class.getDeclaredField("modifiers");
            modifiersField.setAccessible(true);
            modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL);
            field.set(null, newValue);
        }
    }
    

提交回复
热议问题