【问题标题】:Mockito stubbing goes away after first invocation of a stubbed methodMockito 存根在第一次调用存根方法后消失
【发布时间】:2015-03-04 17:26:45
【问题描述】:

Java 8、TestNg 6.8.1、Mockito 1.10.19。

这是我第一次使用 Mockito。我在一个类中存根两个方法,它们都将 String 和 double 作为参数并返回 double。在这种情况下,我只关心第二个参数。

在我的单元测试执行期间调用存根方法时,存根只能正常工作一次。随后对存根方法的调用返回 0 而不是增加/减少参数。我将其解释为方法不再被存根。

这里是代码

MyManager myManagerMock = mock(MyManager.class);
when(myManagerMock.method1(someString, someDouble)).thenReturn(someDouble + 0.5d);
when(myManagerMock.method2(someString, someDouble)).thenReturn(someDouble - 0.5d);

// the class ClassBeingTested has a private member of the type MyManager
ClassBeingTested classBeingTested = new ClassBeingTested(myManager);
// the method getSomeDoubleValue() will perform several calls myManagerMock.method1 and myManagerMock.method2   
assertThat(classBeingTested.getSomeDoubleValue(someString, someDouble), is(anExpectedDoubleValue));

下面是method 1method2ClassBeingTested 中的调用方式: method2(someString, method1(someString, someDouble));

我想知道我做错了什么。据我了解,可以重复调用存根方法,并且它们应该重复返回“thenReturn()”方法中提供的值。

提前感谢所有可以提供帮助的人..

【问题讨论】:

  • 请发布一个完整且可重现的示例。
  • 我的猜测是模拟工作正常,但您的测试设置不正确......

标签: java testng mockito stubbing


【解决方案1】:

解决难题所必需的关键(我在问题的原始版本中错过了这个问题,我现在根据一位论坛成员的建议对其进行了编辑)是我在classBeingTested.getSomeDoubleValue(someString, someDouble) 中调用存根方法的方式。这就是有问题的调用看起来像 method2(someString, method1(someString, someDouble)); 的样子。你可能马上就能看出我的错误。

method1 接收到值someDouble,而method2 接收到由method1 返回的someDouble - 0.5d。这就是Mockito无法识别method2的stubing,方法返回0.0d的原因。

我不得不重写我原来的“嘲笑” when(myManagerMock.method1(someString, someDouble)).thenReturn(someDouble + 0.5d); when(myManagerMock.method2(someString, someDouble)).thenReturn(someDouble - 0.5d);

让它看起来像这样,这样实际的参数值就不再重要了 when(myManagerMock.method1(anyString(), anyDouble())).thenReturn(11.5d); when(myManagerMock.method2(anyString(), anyDouble())).thenReturn(10.5d);

之后一切正常。我还不得不放弃“thenReturn”方法中的“智能”处理。

【讨论】:

    【解决方案2】:

    您必须修改 thenReturn 部分以返回多个值。有点像 -

    .thenReturn(someDouble + 0.5d, someDouble + 0.5d,..);

    Mokito 期望我们在测试用例执行期间提供多次调用存根方法的返回值。试试这个,它应该可以正常工作。

    【讨论】:

    • 如果您只提供一个值,那就是应该始终返回的值。
    • 正如 Sotririos 指出的那样,它们正在对两种不同的方法进行存根,因此您不能使用 .thenReturn(multiple values) 样式。
    • 不幸的是,只有一个值对我不起作用。这就是我使用多个值的原因。
    猜你喜欢
    • 1970-01-01
    • 2013-08-24
    • 1970-01-01
    • 1970-01-01
    • 2014-04-05
    • 2011-05-09
    • 1970-01-01
    • 1970-01-01
    • 2021-07-21
    相关资源
    最近更新 更多