Mockito:@Mock 对象何时初始化以及它调用哪个构造函数

Mockito: When is @Mock object get initialized and which constructor it calls

我试图弄清楚 mockito 是如何在背后工作以便进行调试的。我想知道带有@Mock注解的对象,它是什么时候初始化的?比如,在@Before 之前或@Before 之后?

如果有多个不同的构造函数,mockito 如何确定调用哪些构造函数?

如果我改用 jmockit @Mocked,上面的问题是否有不同的答案?

谢谢!

@Mocked 字段在测试 class 被测试运行器(JUnit、TestNG)实例化之后立即初始化,在任何 @Before/@BeforeMethod 注释方法之前被处决。

模拟实例是由 JMockit 创建的,没有调用模拟实例中的任何构造函数 class。

以上答案也适用于 Mockito(以及任何其他具有类似功能的模拟库)。

Mock 使用 Mockito 创建的对象不调用任何构造函数或静态初始化程序。 (这是通过 Objenesis in older versions of Mockito, and ByteBuddy 在较新版本中实现的。)因此,所有字段都未初始化,并且构造函数中根本没有副作用,包括您可能看到的任何异常抛出。

相比之下,间谍对象do have their constructors called。如果您不初始化该字段,Mockito 将默认调用无参数构造函数(public 或私有),您可以在初始化程序中调用您选择的构造函数。

@Mock 注释初始化的顺序取决于您使用哪种技术来初始化模拟: