I'd like to call a real method of a mocked class, but modifying the parameters. I can't do any change in class that is being tested in order to better design, so I'm using PowerMockito to achieve it.
This is a simple example of a class that should be tested and can't be modified
public class Foo{
public static Bravo whatever(Tango tango, Callable<File> callable, Function<File, File> func, String golf){
callable.call(); // I'd like to call TestFileCallable.call()
}
}
Here is a class that test it:
@RunWith(PowerMockRunner.class)
@PrepareFortest({Foo.class})
@PowerMockIgnore("javax.management.*)
public class TestFoo{
public void testWhatever(){
PowerMockito.mockStatic(Foo.class);
PowerMockito.when(Foo.whatever(Mockito.any(Tango.class), Matchers.any(), Matchers.any(), Mockito.anyString()))
.thenAnswer(new Answer<Object>(){
@Override
public Object answer(InvocationOnMock invocation) throws Throwable {
Object[] args = invocation.getArguments();
Tango tango = (Tango) args[0];
Callable<File> callable = new TestFileCallable();
Function<File, File> func = (Function<File, File>) args[2];
String golf = (String) args[3];
//Until here is ok
Object result = invocation.callRealMethod(); // How can I call the real method but with these modified params?
return result;
}
}
class TestFileCallable implements Callable<File>{
@Override
public File call() throws Exception{
return Mockito.mock(File.class);
}
}
}