如何解决在类中实例化 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 类时调用“create”方法。
任何帮助将不胜感激。
解决方法
类似于:
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();
}
}
然后进行测试,您可以使用返回模拟 DataPersistence
的模拟 InjectorFactory
构建 MyDAO
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。