Mockito 存根在第一次调用存根方法后消失

Mockito stubbing goes away after first invocation of a stubbed method

Java 8,TestNg 6.8.1,Mockito 1.10.19。

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

在我的单元测试执行期间调用存根方法时,存根只能正常工作一次。对存根方法的后续调用 return 0 而不是 increasing/decreasing 参数。我将其解释为好像这些方法不再存根了。

这是代码

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));

我想知道我做错了什么。据我所知,存根方法可以重复调用,它们应该重复 return "thenReturn()" 方法中提供的值。

在此先感谢所有可以提供帮助的人..

您必须将 thenReturn 部分修改为 return 多个值。像 -

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

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

解决这个难题的关键(我在问题的原始版本中遗漏了这一点,现在我已经根据一位论坛成员的建议对其进行了编辑)是我在 [=10] 中调用存根方法的方式=].这就是有问题的调用的样子 method2(someString, method1(someString, someDouble)); 。你可能马上就能看出我的错误。

method1 收到值someDouble,而method2 收到method1 返回的someDouble - 0.5d。这就是Mockito不识别method2存根,方法返回0.0d.

的原因

我不得不重写我原来的 "mocking" 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);

之后一切正常。我还不得不放弃 "smart" 方法中的 "thenReturn" 处理。