I want to mock a static final variable as well as mock a i18n class using JUnit, EasyMock or PowerMock. How do I do that?
Is there something like mocking a variable? I would call that re-assign. I don't think EasyMock or PowerMock will give you an easy way to re-assign a static final
field (it sounds like a strange use-case).
If you want to do that there probably is something wrong with your design: avoid static final
(or more commonly global constants) if you know a variable may have another value, even for test purpose.
Anyways, you can achieve that using reflection (from: Using reflection to change static final File.separatorChar for unit testing?):
static void setFinalStatic(Field field, Object newValue) throws Exception {
field.setAccessible(true);
// remove final modifier from field
Field modifiersField = Field.class.getDeclaredField("modifiers");
modifiersField.setAccessible(true);
modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL);
field.set(null, newValue);
}
Use it as follows:
setFinalStatic(MyClass.class.getField("myField"), "newValue"); // For a String
Don't forget to reset the field to its original value when tearing down.