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 🙂