ChatGPT解决这个技术问题 Extra ChatGPT

如何判断一个对象是否是 Mockito 模拟对象?

是否可以在代码中判断给定对象是否是 Mockito 模拟对象?

我想这样做的原因是在使用模拟时返回不同的错误消息。这将用于向其他开发人员建议他们应该使用预先准备好的模拟,该模拟已经设置为以有用的方式应答呼叫,而不是自己创建模拟。

目前我拥有的最好的是object.getClass().getName().contains("EnhancerByMockitoWithCGLIB"),但这感觉很老套。


T
Tomasz Nurkiewicz

看起来没有这样的 API(请提出问题,应该是!)幸运的是(在下面的评论之后)org.mockito.internal.util 包中有一个方法:

import org.mockito.internal.util.MockUtil;

new MockUtil().isMock(obj)

将来可能会将 Mockito.isMock() 方法添加到公共 API,请参阅:Issue 313: Provide isMock outside of org.mockito.internal)


根据您的回答,我查看了 source for MockUtil,在私有 isMockitoMock 方法的正下方有一个似乎可以使用的公共 isMock 方法。我将在 Mockito 邮件列表上发布,以检查我们自己从 org.mockito.internal.util 调用方法是否是个好主意。
org.mockito.internal.util 包的目的之一是 Mockito 团队可以在更新版本中更改此包中的任何内容。所以如果你使用这个包,你的测试可能会在未来中断。但是,我们极不可能摆脱这种特殊方法,所以我会说它使用起来相当安全。
@mikej:+1,不知何故我错过了那个,谢谢!我删除了旧答案并提出了您的建议,以便更好地脱颖而出。希望你不要介意。
好的,我在 Mockito 问题寄存器上提出了一个问题,以便将 isMock() 添加到主 Mockito 类(即,不是内部的)。除非 Mockito 团队中的其他人反对,否则我将在 Mockito 的下一个版本中添加它。
@TomaszNurkiewicz,isMock 已添加到 api 中。 import org.mockito.Mockito.* mockingDetails(obj).isMock()
m
mikej

作为后续,Mockito 公共 API 现在具有 this method

MockingDetails org.mockito.Mockito.mockingDetails(Object toInspect)

这是@David Wallace 提出的问题的结果。返回的对象支持方法 isMock()isSpy() 以及其他一些提供附加模拟信息的方法。


s
surga

如果你使用 io.mockk.mockk 那么你可以这样做:

isMockKMock()