首次调用存根方法后,Mockito存根就会消失

时间:2015-03-04 17:26:46

标签: java testng mockito stubbing

Java 8,TestNg 6.8.1,Mockito 1.10.19。

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

在执行单元测试期间调用存根方法时,存根只能工作一次。对stubbed方法的后续调用返回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 1内调用method2ClassBeingTested的方式: method2(someString, method1(someString, someDouble));

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

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

2 个答案:

答案 0 :(得分:1)

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

method1收到值someDouble,而method2收到method1返回的someDouble - 0.5d。这就是为什么Mockito没有认识到方法2的存根并且方法返回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”方法中的“智能”处理。

答案 1 :(得分:0)

您必须修改thenReturn部分才能返回多个值。像 -

这样的东西

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

Mokito希望我们提供返回值,因为在测试用例执行期间调用stubbed方法的次数很多。试试这个,它应该工作正常。