莫基托: 想要但未被调用



>我有以下测试方法:

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,它不会尝试调用任何实际方法的实现。

相关内容

  • 没有找到相关文章

最新更新