Mockito模拟在尝试存根包受保护的方法时调用真实方法实现

我正在尝试使用Mockito 1.8.5存根方法,但是这样做会调用实际方法实现(以“”作为parm值),从而引发异常。

package background.internal; //located in trunk/tests/java/background/internal

public class MoveStepTest {

@Test

public void testMoveUpdate() {

final String returnValue = "value";

final FileAttachmentContainer file = mock(FileAttachmentContainer.class);

doReturn(returnValue).when(file).moveAttachment(anyString(), anyString(), anyString());

//this also fails

//when(file.moveAttachment(anyString(), anyString(), anyString())).thenReturn(returnValue);

final AttachmentMoveStep move = new AttachmentMoveStep(file);

final Action moveResult = move.advance(1, mock(Context.class));

assertEquals(Action.done, moveResult);

}

}

我尝试模拟的方法如下所示。没有最终方法或类。

package background.internal; //located in trunk/src/background/internal

public class FileAttachmentContainer {

String moveAttachment(final String arg1, final String arg2, final String arg3)

throws CustomException {

...

}

String getPersistedValue(final Context context) {

...

}

}

我正在传递模拟的类如下所示:

package background.internal; //located in trunk/src/background/internal

public class AttachmentMoveStep {

private final FileAttachmentContainer file;

public AttachmentMoveStep(final FileAttachmentContainer file) {

this.file = file;

}

public Action advance(final double acceleration, final Context context) {

try {

final String attachmentValue = this.file.getPersistedValue(context);

final String entryId = this.file.moveAttachment(attachmentValue, "attachment", context.getUserName());

//do some other stuff with entryId

} catch (CustomException e) {

e.log(context);

}

return Action.done;

}

}

是什么导致真正的实现被调用,我该如何防止呢?

回答:

Mockito代码无法访问您正在模拟的方法。

因为测试代码和被测代码在同一程序包中,所以编译器允许您以这种方式设置模拟,但是在运行时,Mockito库必须尝试访问moveAttachment,但在您的情况下不起作用。这似乎是Mockito中的错误或已知限制,因为它应该支持这种情况(事实上,在大多数情况下确实支持)。

最简单的moveAttachment方法是公开方法。如果那不是一个选择,那么首先要问您是否要模拟它。如果调用真实方法会怎样?

最后一个选择是使用PowerMock将moveAttachment方法视为私有方法,并以此方式对其进行模拟。

以上是 Mockito模拟在尝试存根包受保护的方法时调用真实方法实现 的全部内容, 来源链接: utcz.com/qa/407012.html

回到顶部