如何使 class 的构造函数在其中实例化 Guice 模块时可单元测试?

How to make a class's constructor unit testable when its instantiating a Guice module in it?

我在库模块中有下面提到的 class,客户端将使用它与数据库交互。我有一个 public 构造函数,它从这个库的用户那里获取一个参数,但问题是,它的一个 Guice 模块在这个构造函数中被实例化。因此,当我尝试为此 DataPersistence 类编写单元测试时,我无法注入该模块。我不希望实例化真正的 Guice 模块,因为这将创建数据库连接和所有。

public class DataPersistence {
    
    private MyDAO myDao;

    public DataPersistence(MyConfig myConfig) {
        myDao = Guice.createInjector(new MyDataModule(myConfig)).getInstance(MyDAO.class);
    }
    
    public String createEntry(final CreateIndexInput createIndexInput) throws IOException {
        return myDao.createEntry(createIndexInput);
    }

    public int indexDocument(final String indexName, final String jsonDocument) throws IOException {
        return myDao.indexDocument(indexName, jsonDocument).status().getStatus();
    }

    public SearchResult searchDocument(final String indexName, final Map<String, Object> queryMap)
            throws IOException {
        return myDao.searchDocument(indexName, queryMap);
    }
}

如何将这个 class 转换为一个实用程序,使我能够在不触发真实模块的情况下模拟 Guice 模块?我尝试将构造函数设为私有,并添加了一个“创建”方法并使 class 最终化。但是这样一来,所有的方法都会变成静态的,允许用户调用这些方法,而不必首先在我实例化 myDao 的地方调用“create”方法 class.

如有任何帮助,我们将不胜感激。

类似于:

public interface Config{ ... }

public class MyConfig implements Config{ ... }

public interface InjectorFactory {
  public MyDAO generate();
}

public class MyInjectorFactory{
  private MyConfig myConfig;
  public InjectorFactory(MyConfig myConfig){
    this.myConfig = myConfig;
  }
  public MyDAO generate(){
    return Guice.createInjector(new MyDataModule(myConfig)).getInstance(MyDAO.class);
  }
}

public class DataPersistence { 
  private MyDAO myDao;
  public DataPersistence(InjectorFactory factory) {
    myDao = factory.generate();
  }
}

然后要进行测试,您可以使用模拟 InjectorFactory 构建 DataPersistence,returns 模拟 MyDAO