如何使 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
我在库模块中有下面提到的 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