I\'m trying to stub a method using Mockito 1.8.5, but doing so calls the real method implementation (with \"\" as parm values) which throws an exception.
pac
The method you are mocking is not accessible to the Mockito code.
Because your test code and your code under test are in the same package, the compiler lets you set up your mock that way, but at runtime, the Mockito library has to try to access moveAttachment, but it's not working in your case. This appears to be a bug or known limitation in Mockito as it should support that case, (and in fact, does support it in most cases).
The easiest thing to do would be to make moveAttachment a public method. If that is not an option, then first question whether you want to even mock it. What happens if the real method gets called?
The last option is to use PowerMock to treat the moveAttachment method as a private method and mock it that way.
I disagree with the accepted response.
I think, you have to provide more details on your environment. I can't reproduce your problem. I write the following code in a maven project :
package background.internal; //located in src/main/java
public class FileAttachmentContainer {
String moveAttachment(String arg1, String arg2, String arg3) {
throw new IllegalStateException();
}
String getPersistedValue(Context context) {
throw new IllegalStateException();
}
}
and
package background.internal;
public class AttachmentMoveStep {
private FileAttachmentContainer file;
public AttachmentMoveStep(FileAttachmentContainer file) {
this.file = file;
}
public Action advance(double acceleration, Context context) {
String attachmentValue = file.getPersistedValue(context);
file.moveAttachment(attachmentValue, "attachment", context.getUserName());
return Action.done;
}
}
and the following test pass
package background.internal; //located in src/test/java
import static org.junit.Assert.assertEquals;
import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import org.junit.Test;
public class MoveStepTest {
@Test
public void testMoveUpdate() {
String returnValue = "value";
FileAttachmentContainer file = mock(FileAttachmentContainer.class);
doReturn(returnValue).when(file).moveAttachment(anyString(), anyString(), anyString());
//this also works
//when(file.moveAttachment(anyString(), anyString(), anyString())).thenReturn(returnValue);
AttachmentMoveStep move = new AttachmentMoveStep(file);
Action moveResult = move.advance(1, mock(Context.class));
assertEquals(Action.done, moveResult);
}
}
My project use the following dependencies :