mockito应该调用模拟类的默认构造函数吗?

Dav*_*all 8 java tdd junit mocking mockito

我正在尝试创建一个类的Mockito模拟对象,其中包含一些相当繁重的网络和事务行为,我不想在我正在编写的当前单元测试中处理这些行为.但是,在实例化模拟对象时,Mockito似乎会调用实际类的默认构造函数.默认构造函数执行在此单元测试的上下文中导致问题的各种事物.

Mockito应该调用默认构造函数吗?有没有办法避免这种行为?

这是我创建模拟对象的方法:

ConcreteClassWithComplexDefaultConstructor mockObject = mock(ConcreteClassWithComplexDefaultConstructor.class);
Run Code Online (Sandbox Code Playgroud)

编辑:所以我想出了发生了什么.没有调用具体类的默认构造函数(正如Luciano指出的那样).但是,调用类的静态构造函数.据我所知,静态的东西和Mockito工作得不是很好,但有没有办法解决这个问题,即以某种方式让它忽略静态构造函数.然而,我并没有很高的期望......

Bri*_*128 9

好吧,事实证明我错了.Mockito使用CGLib和Objenesis来创建Object.如果您按照该链接说明它是如何调用超类构造函数的.

使用以下代码可以轻松测试:

public class Test
  public Test() {
    // Never called.
    System.out.println("Constructor was called.");
  }

  public static void main(String[] args) {
    Test test = mock(Test.class);
  }
Run Code Online (Sandbox Code Playgroud)

  • 我会补充说,作为一般规则 - 模拟接口而不是类.实现可能会有所不同,您不希望仅仅因为有人改变某些impl行为而更改测试. (2认同)

Luc*_*sio 7

不,Mockito不会调用模拟类的默认构造函数.