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

mik*_*kej 62 java mockito

是否有可能在代码中告知给定的对象是否是Mockito模拟?

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

目前我所拥有的最好的是object.getClass().getName().contains("EnhancerByMockitoWithCGLIB")但这感觉很骇人.

Tom*_*icz 60

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

import org.mockito.internal.util.MockUtil;

new MockUtil().isMock(obj)
Run Code Online (Sandbox Code Playgroud)

将来Mockito.isMock()可能会将方法添加到公共API中,请参阅:问题313:在org.mockito.internal之外提供isMock).

  • 根据你的回答,我看了[MockUtil的来源](https://fisheye2.atlassian.com/browse/mockito/trunk/src/org/mockito/internal/util/MockUtil.java?r=2020并且直接在私有`isMockitoMock`方法下有一个似乎可以使用的公共`isMock`方法.我将在Mockito邮件列表上发帖,检查是否自己调用`org.mockito.internal.util`中的方法是个好主意. (3认同)
  • 好吧,我在Mockito问题寄存器上提出了一个问题,将`isMock()`添加到主Mockito类(即不是内部).除非Mockito团队中的其他人反对,否则我将在下一版Mockito中添加此内容. (3认同)
  • @TomaszNurkiewicz,isMock已被添加到api中.`import org.mockito.Mockito.*``mockingDetails(obj).isMock()` (3认同)

Spi*_*ina 46

作为后续工作,Mockito公共API现在具有以下方法:

MockingDetails org.mockito.Mockito.mockingDetails(Object toInspect)
Run Code Online (Sandbox Code Playgroud)

这是@David Wallace提出的问题的结果.返回的对象支持方法'isMock()'和'isSpy()',稍后可以增强以提供更多模拟相关信息.