java - 未返回预期对象时的 Mockito
问题描述
我正在尝试从模拟方法返回预期值。
TestClass testClass = TestClass.getInstance();
ClassToMock classToMock = Mockito.mock(ClassToMock.class);
testClass.setClassToMock(classToMock);
ExpectedObject expectedObject = new ExpectedObject("1", "2", "3");
when(classToMock.method(ArgumentMatchers.anyString(), ArgumentMatchers.anyBoolean(),
ArgumentMatchers.any(A.class), ArgumentMatchers.any(B.class))
.thenReturn(expectedObject);
testClass.invokeTestMethod();
TestClass 和 invokeTestMethod 如下所示:
public class TestClass {
private ClassToMock classToMock;
public void invokeTestMethod() {
ExpectedObject expectedObj1 = classToMock.method("A", "B", null, null);
::
::
ExpectedObject expectedObj2 = classToMock.method("X", "Y", null, null);
::
::
ExpectedObject expectedObj3 = classToMock.method("P", "Q", null, null);
::
::
}
public void setClassToMock(ClassToMock ctm) {
this.classToMock = ctm;
}
}
我已经在 TestClass 上设置了 classToMock 实例,以确保 TestClass 在模拟实例上工作。
为了使问题更清楚,方法调用发生在模拟对象(classToMock)上,但是预期的返回值(ExpectedObject)没有出现。
解决方案
此处的问题:null
不匹配any(X.class)
,因此不会返回模拟值
如果null
作为参数传递,那么最后两个参数匹配器就位:
ArgumentMatchers.any(A.class)
ArgumentMatchers.any(B.class)
将不匹配。
请参阅以下文档any(java.lang.Class)
:
匹配给定类型的任何对象,不包括 nulls。(标记为粗体以强调)
这是因为Mockito 2.1.0在内部尝试评估参数的类型(类)。Andnull
是一个空引用,不指向实例化对象。没有对对象的引用,不能评估该对象的任何类:
null instanceOf A // will evaluate to `false`
null instanceOf B // will evaluate to `false`
请参阅在调用 instanceof 之前是否需要进行空检查?
解决方法:使用any()
orisNull()
来匹配null
要在内部调用模拟方法,请使用将匹配null
传递的值的参数匹配器。
推荐阅读
- keycloak - Keycloak客户端baseurl不接受没有http的url
- node.js - 在带有 CloudBuild 的 App Engine 上部署 VueJs + Node 应用程序
- c# - 如何使用 API 组合两个 C# 表达式?
- php - 有没有办法在 php 内部联接查询中引用保存在 phpmyadmin 数据库中的 json 编码数据?
- javascript - 如何检查字符串的第一个字符是否是数字作为 *ngIf 中的条件
- java - CaffeineCacheManager() 构造函数需要 cacheName 吗?
- mapbox-gl - 如何更改 Nebula.gl 中引导线的大小?
- javascript - 当使用 discord.js 更改角色时尝试检查角色时,“无法读取未定义的属性“id””
- sql - IIF 语句显示 0 我知道有一个值
- r - 在 r 中识别负值的问题