Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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?

like image 596
Rajaa Avatar asked Mar 14 '12 07:03

Rajaa


People also ask

Can we mock static variable?

Mocking Static Classes, Methods, and Properties Overview The difference between the two classes is that a static class cannot be instantiated. The new operator cannot create a variable of the class type. Because there is no instance variable, the class name itself should be used to access the members of a static class.

What is difference between mock and PowerMock?

While Mockito can help with test case writing, there are certain things it cannot do viz:. mocking or testing private, final or static methods. That is where, PowerMockito comes to the rescue. PowerMockito is capable of testing private, final or static methods as it makes use of Java Reflection API.

What is PowerMock in JUnit?

PowerMock is an open-source Java framework used for creating a mock object in unit testing. It extends other mocking frameworks such as EasyMock and Mockito to enhance the capabilities.

Is PowerMock a mocking framework?

PowerMock is a framework that extends other mock libraries such as EasyMock with more powerful capabilities. PowerMock uses a custom classloader and bytecode manipulation to enable mocking of static methods, constructors, final classes and methods, private methods, removal of static initializers and more.


1 Answers

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.

like image 190
Antoine Avatar answered Sep 21 '22 20:09

Antoine