我试图弄清楚 mockito 是如何在背后工作的,以便进行调试。我想知道带有@Mock注解的对象,它是什么时候初始化的?比如,在@Before 之前或@Before 之后?
如果有多个不同的构造函数,mockito 如何确定调用哪些构造函数?
如果我改用 jmockit @Mocked,上述问题是否有不同的答案?
谢谢!
最佳答案
Mock 使用 Mockito 创建的对象不调用任何构造函数或静态初始化程序。 (这是通过旧版本的 Mockito 中的 Objenesis 和新版本中的 ByteBuddy 实现的。)因此,所有字段都未初始化,并且构造函数中根本没有副作用,包括您可能看到的任何异常抛出。
相比之下, spy 对象 do have their constructors called .如果您不初始化该字段,Mockito 将默认调用无参数构造函数(公共(public)或私有(private)),您可以在初始化器中调用您选择的构造函数。
@Mock 注释初始化的顺序取决于您使用哪种技术来初始化模拟:
- 如果您使用
MockitoJUnitRunner
, 模拟被初始化 after initializer blocks, constructors, and @Rules, and before any other @Befores如 BlockJUnit4ClassRunner 中定义. - 如果您使用
MockitoRule
, 模拟在任何 @Before 方法之前初始化,但在 undefined order compared to other @Rules 中除非你chain them manually withRuleChain
. - 如果你使用
MockitoAnnotations.initMocks()
,当你调用该方法时,mocks 会被初始化,这是在初始化 block 和规则之后,并且(如果你在 @Before 方法中调用)在 undefined与其他@Before 方法相比的顺序。
关于java - Mockito:@Mock 对象何时初始化以及它调用哪个构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39376471/