Tag Archives: PowerMockRunner

How to mock private static final instance variable using PowerMockRunner?

How to mock private static final instance variable using PowerMockRunner?

Let’s take a scenario which I worked upon recently,

Following is my actual JAVA source class,

WorkflowStream.java

public class WorkflowStream {

    // How to Mock the below tightly coupled variable - DB service object??

    private final static WorkflowDBClient workflowDBClient = WorkflowDBClient.getInstance();

    public String createFlow(String data) {

      boolean isUpdated = workflowDBClient.createRecord(data);

      if (isUpdated) {

        return "SUCCESS";

      }

      return "FAILED";

    }

}

My simple Database class for demo purpose
WorkflowDBClient.java

public class WorkflowDBClient {

    public static WorkflowDBClient getInstance() {

      return new WorkflowDBClient();

    }

    public boolean createRecord(String data) {

      return false;

    }

}

Solution


import static org.junit.Assert.assertEquals;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import org.powermock.reflect.Whitebox;

@RunWith(PowerMockRunner.class)
@PrepareForTest({ WorkflowStream.class })
public class WorkflowStreamTest {

    @InjectMocks
    WorkflowStream workflowStream;

    WorkflowDBClient workflowDBClientMocked;

    @Before
    public void initMocks() throws Exception {

      // Mocking the DB object

      workflowDBClientMocked = Mockito.mock(WorkflowDBClient.class);

      // Note: Original method returns FALSE. But below we Mocked to return TRUE

      Mockito.when(workflowDBClientMocked.createRecord(Mockito.anyString())).thenReturn(true);

      // Injecting the mocked DB service object into WorkflowStream

      Whitebox.setInternalState(WorkflowStream.class, "workflowDBClient", workflowDBClientMocked);

    }

    @Test
    public void createFlowTest() throws Exception {

      String testData = "my input test record";

      String status = workflowStream.createFlow(testData);

      assertEquals(status, "SUCCESS");

    }

}

Happy Learning 🙂