首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mockito UnfinishedStubbingException

Mockito UnfinishedStubbingException
EN

Stack Overflow用户
提问于 2013-03-22 01:23:15
回答 4查看 34K关注 0票数 25

我是Mockito的新手,我已经尝试过调查这个异常,但我还没有找到一个具体的答案。当我同时使用两个mock时,它就会在我的代码中发生,这意味着我通过一个mock的构造函数给出了另一个mock。如下所示:

代码语言:javascript
复制
...
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调用混淆,所以我尝试了以下方法:

代码语言:javascript
复制
NumericalValue value = getIntegerValue(2);
child.insertNode(getConstantNode(value));

但无济于事。我确保只调用toString()getValue()方法,因为这是该类拥有的惟一方法。我不明白这是怎么回事

我还尝试单独使用mock,看看我是否做错了什么:

代码语言:javascript
复制
child.insertNode(new ConstantNode(getIntegerValue(2)));

这很好用。

代码语言:javascript
复制
child.insertNode(getConstantNode(new IntegerValue(2)));

这也很好用。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-03-22 07:37:42

从我在Mockito (https://code.google.com/p/mockito/issues/detail?id=53)的“第53期”上读到的内容来看,我的代码由于mockito中涉及的验证框架而遇到了问题。准确地说,下面的代码本身就是导致异常的原因。

代码语言:javascript
复制
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“链。

我是如何修复它的:

代码语言:javascript
复制
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 了。我发现这是一个完整的代码气味,因为我必须留下一个注释来解释为什么我在代码中使用一个看似无用的中间变量。

谢谢你的帮助。

票数 31
EN

Stack Overflow用户

发布于 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 stubber

Mockito之所以抱怨,正是因为对mock的调用,即步骤3,发生在步骤2 (when)之后,但在步骤4 (thenReturn)之前,从而导致验证框架抱怨存根。Joy,你的回答将麻烦的步骤3移到了步骤1之前,这是可以的;Sajan将其从语句中完全删除,这也是可以的。

票数 9
EN

Stack Overflow用户

发布于 2013-03-22 02:02:41

我想问题出在线路上。

方法getConstantNode中的Mockito.when(node.toString()).thenReturn(value.toString());

尝试删除该行并检查它是否正常工作。也许你可以这样做

代码语言:javascript
复制
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;
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15554119

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档