我是 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)));
这也很好用。
原文由 Chayemor 发布,翻译遵循 CC BY-SA 4.0 许可协议
根据我在 mockito ( https://code.google.com/p/mockito/issues/detail?id=53 ) 的“问题 53”上阅读的内容,由于 Mockito 中涉及的验证框架,我的代码遇到了问题。正是以下代码本身导致了异常。
如果你还记得我的代码,参数值也是一个模拟,所以当
value.toString()
thenReturn()
调用时,我相信(如果我错了,请有人纠正我)验证框架被触发并确保每个“何时”都有其thenReturn()
调用/验证/等。因此,如果发生这种情况,Mockito.when(node.toString()).thenReturn(value.toString()
将不会被验证,因为它没有从valute.toString()
返回,它启动了整个“验证一切”链。我是如何修复它的:
这样,它就 可以 得到验证。我发现这是一个完整的代码味道,因为我实际上必须留下一条注释来解释为什么我在代码中使用看似无用的中间变量。
谢谢您的帮助。