我是Mockito的新手,我已经尝试过调查这个异常,但我还没有找到一个具体的答案。当我同时使用两个mock时,它就会在我的代码中发生,这意味着我通过一个mock的构造函数给出了另一个mock。如下所示:
...
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;
}在一个论坛上,我读到关于不要通过另一个mock的构造函数发送mock的内容,因为Mockito可能会与mock调用混淆,所以我尝试了以下方法:
NumericalValue value = getIntegerValue(2);
child.insertNode(getConstantNode(value));但无济于事。我确保只调用toString()和getValue()方法,因为这是该类拥有的惟一方法。我不明白这是怎么回事
我还尝试单独使用mock,看看我是否做错了什么:
child.insertNode(new ConstantNode(getIntegerValue(2)));这很好用。
child.insertNode(getConstantNode(new IntegerValue(2)));这也很好用。
发布于 2013-03-22 07:37:42
从我在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;
}如果你记得我的代码,参数值也是一个模拟,所以当在thenReturn()上调用value.toString()时,我相信(如果我错了,有人请纠正我),验证框架被触发,并确保每个" when“都有它的thenReturn()调用/validated/等。因此,如果发生这种情况,Mockito.when(node.toString()).thenReturn(value.toString() 将不会被验证,因为它没有从valute.toString()返回,这启动了整个”validation everything“链。
我是如何修复它的:
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;
}这样,就可以验证it 了。我发现这是一个完整的代码气味,因为我必须留下一个注释来解释为什么我在代码中使用一个看似无用的中间变量。
谢谢你的帮助。
发布于 2013-03-22 10:22:21
在这个问题中已经发布了一些很好的修复,但是对于任何仍然不能理解它的人来说,想想Java调用所有这些方法的顺序。根据Java Language Specification,Java evaluates every parameter of a method left-to-right before calling the method
开始设置stubbing
value.toString,,这是一个模拟呼叫,Mockito records
thenReturn on the stubberMockito之所以抱怨,正是因为对mock的调用,即步骤3,发生在步骤2 (when)之后,但在步骤4 (thenReturn)之前,从而导致验证框架抱怨存根。Joy,你的回答将麻烦的步骤3移到了步骤1之前,这是可以的;Sajan将其从语句中完全删除,这也是可以的。
发布于 2013-03-22 02:02:41
我想问题出在线路上。
方法getConstantNode中的Mockito.when(node.toString()).thenReturn(value.toString());
尝试删除该行并检查它是否正常工作。也许你可以这样做
int num = 2;
child.insertNode(getConstantNode(getIntegerValue(num), num);
...
private ConstantNode getConstantNode(NumericalValue value){
ConstantNode node = Mockito.mock(ConstantNode.class);
Mockito.when(node.evaluate()).thenReturn(value);
Mockito.when(node.toString()).thenReturn(Integer.toString(number));
return node;
}
private IntegerValue getIntegerValue(int number) {
IntegerValue integerValue = Mockito.mock(IntegerValue.class);
Mockito.when(integerValue.getValue()).thenReturn(number);
return integerValue;
}https://stackoverflow.com/questions/15554119
复制相似问题