简体   繁体   中英

How to mock a static final variable using JUnit, EasyMock or PowerMock

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.

It can be done using a combination of PowerMock features. Static mocking using the @PrepareForTest({...}) annotation, mocking your field (I am using Mockito.mock(...) , but you could use the equivalent EasyMock construct) and then setting your value using the WhiteBox.setInternalState(...) method. Note this will work even if your variable is private .

See this link for an extended example: http://codyaray.com/2012/05/mocking-static-java-util-logger-with-easymocks-powermock-extension

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM