>我有以下测试方法:
MyClass myClass= Mockito.mock(MyClass.class);
Mockito.when(myClass.methodUsedInMethodBeingTested(Matchers.any(MyTypeParam.class))).thenReturn(Collections.<X, Y> emptyMap());
assertNull(myClass.methodToTest(myObject));
Mockito.verify(myClass).methodUsedInMethodBeingTested(Matchers.any(MyTypeParam.class));
methodUsedInMethodBeingTested
是我想模拟并返回空地图的方法。但是我收到失败消息说
想要但未调用 myClass.methodUsedInMethodBeingTested()
.
MyClass
{
public XYZ methodToTest()
{
....
....
Map<X,Y> mp = methodUsedInMethodBeingTested(myTypeParam);
.....
}
public Map<X,Y> methodUsedInMethodBeingTested(MyTypeParam myTypeParam)
{
.....
}
}
你误解了什么是模拟。当你在做
MyClass myClass = Mockito.mock(MyClass.class);
// ...
assertNull(myClass.methodToTest(myObject));
您实际上并没有在真实对象上调用methodToTest
。您正在模拟上调用methodToTest
,默认情况下,它不执行任何操作并返回null
,除非它是存根。引用Mockito文档:
默认情况下,对于所有返回值的方法,mock 返回 null、空集合或适当的原始/原始包装器值(例如:0、false、...对于整数/整数,布尔值/布尔值,...)。
这解释了您随后的错误:该方法实际上没有在模拟中调用。
似乎您在这里想要的是一个spy
:
您可以创建真实物体的间谍。当您使用间谍时,将调用真正的方法(除非方法被存根)。
但需要注意的是:由于调用的是真正的方法,因此不应使用Mockito.when
而应使用Mockito.doReturn(...).when
,否则该方法将被实际调用一次。如果考虑表达式:
Mockito.when(myClass.methodUsedInMethodBeingTested(Matchers.any(MyTypeParam.class))).thenReturn(Collections.<X, Y> emptyMap());
^-----------------------------------^
this will be invoked by Java
必须计算方法when
参数,但这意味着将调用方法methodUsedInMethodBeingTested
。由于我们有间谍,因此将调用它是真正的方法。因此,请改为使用:
MyClass spy = Mockito.spy(new MyClass());
Mockito.doReturn(Collections.<X, Y> emptyMap()).when(spy).methodUsedInMethodBeingTested(Matchers.any(MyTypeParam.class));
assertNull(spy.methodToTest(myObject));
Mockito.verify(spy).methodUsedInMethodBeingTested(Matchers.any(MyTypeParam.class));
您正在模拟实例上调用methodToTest
。因为您没有在其他情况下配置它,所以它只返回 null,它不会尝试调用任何实际方法的实现。