首页 > 解决方案 > 模拟复杂的 Java 对象

问题描述

有没有办法在不修改源代码的情况下模拟一个非常复杂的对象,在一个类中静态初始化?

代码看起来像这样。

public class SomeType {

  private static final ComplexType TYPE = new ComplexType();

  public SomeType() {}

  public Object process(int id, String content) { 
    ...
    TYPE.something();
    ...
  }
}

尝试SomeType通过调用来测试类的行为

new SomeType().process(1, "<some text>");

需要以某种方式ComplexType模拟对象,该对象在其定义中静态初始化了许多其他复杂对象,以及初始化期间的网络密集型操作。结果,mock()或者spy()不起作用,因为ComplexType对象在引用SomeType类时被初始化。看来,要模拟ComplexType对象,需要准备所有复杂的依赖项,这使得测试代码变得复杂。

建议的另一种方法是通过反射修改static final字段。TYPE但是这也不起作用,因为它发生在初始化之后TYPE,所以初始化引起的错误已经发生了。

标签: javamockingmockitopowermockito

解决方案


推荐阅读