微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决在类中实例化 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 举报,一经查实,本站将立刻删除。