gpt4 book ai didi

java - Mockito UnfinishedStubbingException

转载 作者:IT老高 更新时间:2023-10-28 20:51:33 25 4
gpt4 key购买 nike

我是 Mockito 的新手,我曾尝试调查此异常,但我还没有找到具体的答案。当我一起使用两个模拟时,它会发生在我的代码中,这意味着我通过一个模拟的构造函数,另一个模拟。像这样:

...
OperationNode child = getNode(Operation.ADD);
child.insertNode(getConstantNode(getIntegerValue(2));
...

private ConstantNode getConstantNode(NumericalValue value){
ConstantNode node = Mockito.mock(ConstantNode.class);
Mockito.when(node.evaluate()).thenReturn(value);
Mockito.when(node.toString()).thenReturn(value.toString());
return node;
}

private IntegerValue getIntegerValue(int number) {
IntegerValue integerValue = Mockito.mock(IntegerValue.class);
Mockito.when(integerValue.getValue()).thenReturn(number);
Mockito.when(integerValue.toString()).thenReturn(Integer.toString(number));
return integerValue;
}

在一个论坛中,我读到了关于不通过另一个模拟的构造函数发送模拟的信息,因为 Mockito 可能会对模拟调用感到困惑,所以我尝试了以下方法:

NumericalValue value = getIntegerValue(2);
child.insertNode(getConstantNode(value));

但无济于事。我确保只有方法 toString()getValue() 被调用,因为这些是类仅有的方法。我不明白发生了什么。

我也尝试过单独使用模拟,看看我是否做错了什么:

child.insertNode(new ConstantNode(getIntegerValue(2)));

效果很好。

child.insertNode(getConstantNode(new IntegerValue(2)));

这也很好用。

最佳答案

根据我在 mockito (https://code.google.com/p/mockito/issues/detail?id=53) 的“第 53 期”中读到的内容,由于 Mockito 中涉及的验证框架,我的代码遇到了问题。正是以下代码本身导致了异常。

private ConstantNode getConstantNode(NumericalValue value){
ConstantNode node = Mockito.mock(ConstantNode.class);
Mockito.when(node.evaluate()).thenReturn(value);
Mockito.when(node.toString()).thenReturn(value.toString());
return node;
}

如果你记得我的代码,参数值是 ALSO A MOCK,所以当 thenReturn() 上调用 value.toString() 时,我相信(如果我错了,请有人纠正我)验证框架被触发,并确保每个“何时”都有其 thenReturn() 调用/验证/等。因此,如果发生这种情况, Mockito.when(node.toString()).thenReturn(value.toString() 将不会被验证,因为它还没有从value.toString(),它启动了整个“验证一切”链。

我是如何解决的:

private ConstantNode getConstantNode(NumericalValue value){
ConstantNode node = Mockito.mock(ConstantNode.class);
Mockito.when(node.evaluate()).thenReturn(value);

String numberToString = value.toString();

Mockito.when(node.toString()).thenReturn(numberToString);
return node;
}

这样,它可以得到验证。我发现这是一种完整的代码异味,因为我将不得不留下一条注释来解释为什么我在代码中使用了一个看似无用的中间变量。

感谢您的帮助。

关于java - Mockito UnfinishedStubbingException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15554119/

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