gpt4 book ai didi

java - 尝试 stub 包保护方法时,Mockito 模拟调用真实方法实现

转载 作者:IT老高 更新时间:2023-10-28 21:16:02 24 4
gpt4 key购买 nike

我正在尝试使用 Mockito 1.8.5 对方法进行 stub ,但这样做会调用引发异常的真实方法实现(使用 ""作为参数值)。

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);
}
}

我试图模拟的方法如下所示。没有 final方法或类。

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) {
...
}
}

我通过模拟的类(class)看起来像这样:

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,但它不适用于您的情况。这似乎是 bugknown limitation在 Mockito 中,因为它应该支持这种情况,(事实上,在大多数情况下确实支持它)。

最简单的方法是使 moveAttachment 成为公共(public)方法。如果这不是一个选项,那么首先要问你是否想模拟它。如果调用真正的方法会发生什么?

最后一个选项是使用 PowerMockmoveAttachment 方法视为私有(private)方法并以这种方式模拟它。

关于java - 尝试 stub 包保护方法时,Mockito 模拟调用真实方法实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11996809/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com