当一个类在其中实例化一个Guice模块时,如何使它的构造函数单元可测试?



我在库模块中有下面提到的类,客户端将使用它与数据库交互。我有一个公共构造函数,它从这个库的用户那里获取一个参数,但问题是,它是一个在这个构造函数中实例化的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);
}
}

如何将这个类转换为一个实用程序,以便在不触发真实模块的情况下模拟Guice模块?我尝试将构造函数设为私有,并添加了一个";创建";方法,并使该课成为期末考试。但通过这种方式,所有的方法都将变为静态的,允许用户调用这些方法,而不必调用";创建";方法首先实例化myDao类。

任何帮助都将不胜感激。

类似于:

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();
}
}

然后为了进行测试,您可以使用返回模拟MyDAO的模拟InjectorFactory构建DataPersistence

相关内容

最新更新