Mockito 3 any()严格禁止参数不匹配

r7knjye2  于 12个月前  发布在  其他
关注(0)|答案(2)|浏览(192)

我用的是Mockito 3.1.0。
我试着用这个语法来模拟我的方法:

when(mockedObject.myMethod(any(HttpServletRequest.class)).thenReturn(1);

字符串
myMethod是:

public Integer myMethod(HttpServletRequest request) {
    return 0;
}


在我正在测试的方法中,它被简单地调用:

int r = myObject.myMethod(request);


但我得到了:

org.mockito.exceptions.misusing.PotentialStubbingProblem: 
Strict stubbing argument mismatch. Please check:
 - this invocation of 'myMethod' method:
    mockedObject.myMethod(null);
    -> at somefile.java:160)
 - has following stubbing(s) with different arguments:
    1. mockedObject.myMethod(null);
      -> at somefileTest.java:68)

sf6xfgos

sf6xfgos1#

正如这里所解释的,如果提供的参数为空,则**any(myClass)不起作用,只有any()**会起作用。在我的例子中,request为空,因此any(HttpServletRequest.class)无法捕获它。我通过更改

when(mockedObject.myMethod(any(HttpServletRequest.class)).thenReturn(1);

字符串
如果您确定它将为null,请将其转换为

when(mockedObject.myMethod(null)).thenReturn(1);


如果你想抓住所有案例

when(mockedObject.myMethod(any())).thenReturn(1);


另一种方法是使用ArgumentMatchers

when(mockedObject.myMethod(ArgumentMatchers.<HttpServletRequest>any())).thenReturn(1);


感谢@xerx593的解释。

dsekswqp

dsekswqp2#

可以使用nullable(MyClass.class)来接受null或给定类型。
这是我认为最早出现的版本(v2.5.0),但在Mockito 3和最新版本(v5.8.0)中也可以使用。

  • https://javadoc.io/doc/org.mockito/mockito-core/2.5.0/org/mockito/ArgumentMatchers.html#nullable(java.lang.Class)

但是,您不太可能有未使用的HttpServletRequest request,因此为了避免NullPointerException,您可能希望模拟它,而不是允许它在测试中为空。

相关问题