我是Mockito的新手,我曾尝试研究此Exception,但未找到具体答案。当我同时使用两个模拟时,它会在我的代码中发生,这意味着我通过一个模拟的构造函数给出了另一个模拟。像这样:
...
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的“问题53”(https://code.google.com/p/mockito/issues/detail?id=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;
}
如果您还记得我的代码,则参数值也为MOCK,因此当在value.toString()
上调用时thenReturn()
,我相信(如果我错了,请纠正我)验证框架会触发并确保每次“何时”已经thenReturn()
调用/验证/等。因此,如果发生这种情况,
Mockito.when(node.toString()).thenReturn(value.toString()
将不会对其进行验证, 因为
不会从中 返回valute.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;
}
这样, 可以 对其进行验证。我发现这是完整的代码味道,因为我将不得不留下一条注释来解释为什么我在代码中使用了看似无用的中间变量。
谢谢您的帮助。