我正在试图弄清楚mockito是如何工作的,以便进行调试。我想知道带有@Mock注释的对象,什么时候初始化?喜欢,在@Before之前或@Before之后?
如果有几个不同的构造函数,mockito如何确定要调用哪些构造函数?
如果我使用jmockit @Mocked,那么上述问题的答案是否有任何不同?
谢谢!
答案 0 :(得分:5)
Mock 对象不会调用任何构造函数或静态初始化程序。 (这是通过旧版Mockito中的Objenesis和较新版本中的ByteBuddy来实现的。)因此,所有字段都是未初始化的,并且构造函数中没有任何副作用发生,包括您可能的任何异常看到抛出。
相比之下,间谍对象do have their constructors called。如果你没有初始化字段,Mockito将默认调用无参数构造函数(公共或私有),并且你可以在初始化程序中调用你选择的构造函数。
@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 with RuleChain
。sessionId = this.route.queryParams.map(params => params['session_id'] || 'None');
,则在调用该方法时,即在初始化程序块和规则之后,以及(如果在@Before方法中调用)与其他@Before方法相比,默认初始化模拟答案 1 :(得分:2)
@Mocked
/ @Before
- 注释方法执行之前,测试运行器(JUnit,TestNG)实例化测试类之后, @BeforeMethod
字段被初始化。
模拟实例由JMockit创建,无需调用模拟类中的任何构造函数。
以上答案也适用于Mockito(以及任何其他具有类似功能的模拟库)。