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

Mockito.any返回null

荆亦
2023-03-14

我正在尝试使用这样的参数模拟静态方法:

Mockito.when(StaticClass.staticMethod(Mockito.any(A.class), 
                                      Mockito.any(B.class), SomeEnum.FOO))
       .thenReturn(true);

我添加了以下注释:

@RunWith(PowerMockRunner.class)
@PowerMockRunnerDelegate(Parameterized.class)
@PrepareForTest({StaticClass.class, A.class, B.class})

但是Mockito.any总是返回null。为什么?

共有3个答案

居飞扬
2023-03-14

你搞错了。像any()这样的匹配器方法的唯一目的是匹配执行时传入的参数。

您可以使用这些方法来指导模拟框架预期会发生什么调用。或者反过来,你用它们来说:如果这个或那个是作为论点,那么就做这个或那个。

因此,您绝对不关心匹配器调用的结果。

从这个意义上说,你的问题表明你对模拟框架的使用是错误的。因此,关于你当前的输入,我们能给出的唯一答案是: a)做更多的研究如何使用模拟,b)然后修改你的问题,以弄清楚你的问题。

微生高谊
2023-03-14

首先,不能将匹配器与实际参数混为一谈。您也应该为SomeEnum参数使用匹配器:

Mockito.when(StaticClass.staticMethod(Mockito.any(A.class), 
                                      Mockito.any(B.class), Mockito.eq(SomeEnum.FOO))
       .thenReturn(true);

其次,any()方法应该返回null。这正是他们所做的。如果您查看这些方法的代码,如果它是原始包装对象(如整数、布尔等),它们会返回类类型的默认值,否则返回null:

public <T> T returnFor(Class<T> clazz) {
    return Primitives.isPrimitiveOrWrapper(clazz) ? Primitives.defaultValueForPrimitiveOrWrapper(clazz) : null;
}
谢和颂
2023-03-14

简答:使用<code>doReturn()。when()而不是when(.then()

长长的答案可以在这里找到:Mockito匹配器是如何工作的?

匹配器返回虚拟值,例如零、空集合或 null。Mockito尝试返回一个安全,适当的虚拟值,例如0表示anyInt()或any(Integer.class)或空列表表示anyListOf(String.class)。但是,由于类型擦除,Mockito缺少类型信息来返回任何值,但对于any()为null

NullPointerException或其他异常:调用when(foo.bar(any()))。thenReturn(baz)将实际调用foo.bar(null ),您可能已经将其存根化,以便在收到null参数时抛出异常。切换到doReturn(巴兹)。当(foo)。bar(any())跳过存根行为。

附带说明:这个问题也可以描述为,如何在具有空参数先决条件检查的方法上使用Mockito匹配器?

 类似资料:
  • 我试图理解在Mockito的情况下泛型是如何工作的。 我试图模拟,但是下面的代码不能编译,我不知道为什么: 为什么会这样? 和有什么区别? 他们应该是一样的,对吧?

  • 问题内容: 是否可以通过泛型传递接口的类型? 界面: 在我的测试方法中: 把后面或没有工作。 问题答案: 有一种类型安全的方法:使用并使用以下类型进行限定:

  • 问题内容: 例如我有一个功能: 我怎样才能返回AJAX后得到的? 问题答案: 因为请求是异步的,所以您无法返回ajax请求的结果(而同步ajax请求是一个 糟糕的 主意)。 最好的选择是将自己的回调传递给f1 然后,您将像这样致电:

  • 我有两个活动和两个布局。当我在第一个活动中显示列表时,一切都正常,并在单击时给出列表中项目的编号,但当我尝试在第二个活动中重复相同的内容时,它会告诉我RecycleServiceClickListener侦听器为空。 适配器: 第一项活动: 第二项活动: 错误: 我不明白为什么在第一种情况下,它正常处理单击,而在第二种情况下,它说RecyclerViewClickListener为null

  • 问题内容: 我在使用Ajax时遇到问题。 问题是,在获得ajax响应之前,它会返回cnt。因此它总是返回NULL。 有没有办法使正确的返回响应值? 谢谢! 问题答案: 由于AJAX请求是异步的,因此您的cnt变量将在请求返回并调用成功处理程序之前返回。 我建议重构您的代码以解决此问题。 一种方法是从AJAX请求的成功处理程序中调用调用了GetGrantAmazonItemCnt()的任何函数,此方

  • 我想在下面返回JSON。 {“名字”:“杰基”} 新来的春靴在这里。1天大。有没有合适的方法可以做到这一点?