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

时间:2016-09-07 17:59:25

标签: java unit-testing junit mockito jmockit

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

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

如果我使用jmockit @Mocked,那么上述问题的答案是否有任何不同?

谢谢!

2 个答案:

答案 0 :(得分:5)

使用Mockito创建的

Mock 对象不会调用任何构造函数或静态初始化程序。 (这是通过旧版Mockito中的Objenesis和较新版本中的ByteBuddy来实现的。)因此,所有字段都是未初始化的,并且构造函数中没有任何副作用发生,包括您可能的任何异常看到抛出。

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

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

答案 1 :(得分:2)

在任何@Mocked / @Before - 注释方法执行之前,测试运行器(JUnit,TestNG)实例化测试类之后,

@BeforeMethod字段被初始化。

模拟实例由JMockit创建,无需调用模拟类中的任何构造函数。

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