当前位置: 首页 > 知识库问答 >
问题:

Mockito:通缉但未调用

申查猛
2023-03-14

我有如下测试方法:

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

MethodUsedInMethodBeingTest是我要模拟并返回空映射的方法。但我收到的失败信息说

需要但未调用MyClass.MethodUsedInMethodBeingTest()

.

MyClass
{
   public XYZ methodToTest()
   {
    ....
    ....
    Map<X,Y> mp = methodUsedInMethodBeingTested(myTypeParam);
    .....
   }

   public Map<X,Y> methodUsedInMethodBeingTested(MyTypeParam myTypeParam)
   {
    .....
   }
}

共有1个答案

郭弘盛
2023-03-14

你误会了什么是模仿。当你在做

MyClass myClass = Mockito.mock(MyClass.class);
// ...
assertNull(myClass.methodToTest(myObject));

实际上并不是在实际对象上调用MethodToTest。您将在模拟上调用MethodToTest,默认情况下,该模拟不执行任何操作并返回NULL,除非它被挂起。引用Mockito文档:

默认情况下,对于所有返回值的方法,mock将返回null、空集合或适当的基元/基元包装值(例如:0、false、...for int/integer、boolean/boolean、...)。

这解释了您随后出现的错误:实际上没有在mock上调用该方法。

看来您需要的是spy:

你可以创建真实物体的间谍。当您使用spy时,将调用真正的方法(除非某个方法被挂起)。

但需要注意的是:由于调用的是real方法,因此不应使用mockito.when,而应使用mockito.doreturn(...).when,否则将为real调用一次该方法。如果考虑以下表达式:

Mockito.when(myClass.methodUsedInMethodBeingTested(Matchers.any(MyTypeParam.class))).thenReturn(Collections.<X, Y> emptyMap());
             ^-----------------------------------^
                 this will be invoked by Java

必须计算方法when的参数,但这意味着将调用方法MethodUsedInMethodBeingTest。而且既然我们有一个间谍,它就是将被调用的真正的方法。因此,请使用:

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));
 类似资料:
  • 我是写测试和使用Mockito的新手。我在Stackoverflow上阅读了类似的主题,并做了建议的更改,确保所考虑的类/接口/方法是开放的。 我试图跟踪这个 模仿构造函数注入的依赖项 这是我目前想出来的测试 但我一直得到的回应是 即使我在测试中没有提到这种方法,我也得到了这种反应。这是我的演示者注册方法。我已经改变了类/接口 同样地 这里是接口 感谢您的帮助。

  • 我有个问题。我用mockito创建对象。然后我对方法进行验证,当运行测试时,它给我的错误是Wanted但not invived。并且服务保持为()。 test不是按照verify运行的,没有调用Wanted buy。

  • 我已经通过StackOverflow上的帖子。 想要但没有被调用:实际上,这个模拟没有任何交互。 我确实做了被要求的事情,但我仍然错过了一些东西。你能帮帮我我错过了什么吗? 我的Java代码: 我的单元测试: 一切正常工作,除了我得到错误作为

  • 我知道其他人问过这个(或类似的)问题,但没有一个解决方案对我有帮助。我有3节课: 我的测试类: 我想验证B. subMethod()是否在A. superMethod()中被调用。我如何才能完成此任务。我知道我需要使用PowerMock来完成此任务,但我不确定如何。此外,我不允许更改有关A类或B类的任何内容。 任何帮助都将不胜感激!

  • 我试图学习和,以实现我正在为一个已经工作的Android项目创建测试。但是我有一些麻烦。这会让你知道我想测试的活动: 这段代码所做的是获取Active会话,根据它的状态,它显示了不同的。现在我将向您展示测试类: 正如你所见,我在一个单独的java项目中使用了Robolectric和Mockito。当我运行测试类时,我得到以下信息: 你能帮我一下吗? 编辑 我去掉了ActivityControlle

  • 我实际上是在努力做下面的事情:我的服务类 这让我想要的没有被调用,实际上与这个模拟没有任何交互。你知道我做错了什么吗??