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 注释初始化的顺序取决于您使用哪种技术来初始化模拟:
- 如果你使用
MockitoJUnitRunner
, mocks are initialized after initializer blocks, constructors, and @Rules, and before any other @Befores as defined in BlockJUnit4ClassRunner.
- 如果你使用
MockitoRule
, mocks are initialized before any @Before methods, but in undefined order compared to other @Rules unless you chain them manually with RuleChain
.
- 如果您使用
MockitoAnnotations.initMocks()
,模拟将在您调用该方法时准确初始化,该方法在初始化程序块和规则之后,并且(如果您在 @Before 方法中调用)与其他 @ 相比未定义的顺序在方法之前。
我试图弄清楚 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 注释初始化的顺序取决于您使用哪种技术来初始化模拟:
- 如果你使用
MockitoJUnitRunner
, mocks are initialized after initializer blocks, constructors, and @Rules, and before any other @Befores as defined in BlockJUnit4ClassRunner. - 如果你使用
MockitoRule
, mocks are initialized before any @Before methods, but in undefined order compared to other @Rules unless you chain them manually withRuleChain
. - 如果您使用
MockitoAnnotations.initMocks()
,模拟将在您调用该方法时准确初始化,该方法在初始化程序块和规则之后,并且(如果您在 @Before 方法中调用)与其他 @ 相比未定义的顺序在方法之前。