Used to call an private method, just a wrapper on Java Reflection API's
// Example Source Class
public class ExampleClass {
private int getHeight() {
// Lets say we have a generic method which provides different result base on the provided id
final CustomClass customClassInstance = new CustomClass();
return customClass.getHeight();
}
}
We can use Whitebox.invokeMethod() to execute that method, here an example:
@RunWith(PowerMockRunner.class)
@PrepareForTest({
ExampleClass.class
})
public class ExampleClassTest {
private ExampleClass classUnderTest;
@Before
public void setUp() throws Exception {
// Create constructor of ExampleClass
classUnderTest = new ExampleClass();
}
@Test
public void getHeight_shoudReturnHeightOfView() throws NoSuchMethodException {
final int expectedHeight = 100;
// Given
final CustomClass mckCustomClass = Mockito.mock(CustomClass.class);
Mockito.when(mckCustomClass.getHeight()).theReturn(expectedHeight);
// Make sure you match exact parameters while mocking (same as we do for Mockito.mock statements).
// There is also withArguments(first, second, ....)
// and withAnyArguments() for cases when you dont care for arguments passed.
PowerMockito.whenNew(CustomClass.class).withNoArguments().thenReturn(mckCustomClass);
final int actualResult = Whitebox.invokeMethod(classUnderTest, "getHeight");;
Assert.assertEquals(expectedHeight, actualResult);
}
}
Note: you should not call invokeMethod() unnecessarily, try to follow code execution flow to get to any private method.