如何从不由容器管理的类访问容器管理对象

时间:2015-10-19 13:47:38

标签: java jpa cdi

有没有办法从容器创建或管理的类中访问通常由容器创建和管理的对象?换句话说,当有容器时,可以使用容器管理的类实例的代码,当没有容器时,可以使用常规POJO吗?

对我来说关键是测试类不知道它所获得的类是来自容器还是来自某个存根。

我可能是老上学但我想使用可配置的工厂类来访问我的数据库。在生产或集成测试中,它将返回一个容器注入的DAL接口实现。单元测试时,我想要删除DAL并返回静态值。

这可能吗?

怎么做?

这是我到目前为止所处的地方,但仍然没有快乐......

工厂类

@Stateless
public class DALFactory
{
   @Inject
   private static DALInterface DAL;

   public static void init(String fqcn)
   {
      // use reflect to create unit test instance
   }

   public static DALInterface getDAL()
   {
      return DAL;
   }
}

测试课

public class test
{
   public void testDALAccess()
   {
      Table t = new Table(); // Instance of class representing a table
      DALFactory.getDAL().persist(t);
   }
}

当我提供我的testDAL时这很好用,因为我用FQCN调用init()但是当我尝试使用容器管理的实例时,它失败了。

你可能会猜到我对CDI和JPA有点新鲜。

仅供参考我将DALFactory标记为@Stateless的唯一原因是,当有容器时,容器可以管理它。

1 个答案:

答案 0 :(得分:0)

所以这就是我最终解决问题的方法。在我这样做之后,我能够隔离依赖于注入和相关容器的代码,这样我就可以在没有容器的情况下进行测试。

注意 - 我仍然对解决这个问题的其他方法持开放态度,这样我可以在有和没有容器执行注入的情况下测试相同的代码。

// DAL Factory

public class DALFactory
{
   private static DALInterface DAL;

   public static void setDAL(DALInterface di)
   {
      DAL = di;
   }

   public static void init(String fqcn)
   {
      // use reflect to create unit test instance
   }

   public static DALInterface getDAL()
   {
      return DAL;
   }
}

//根可注入类,这必须是可注射树的顶部

@Stateless
public MainClass
{
  @Inject
  ProdDAL dal;

  @PostConstruct
  public void postConstruct()
  {
      DALFactory.setDAL(new DALWrapper(this.dal));
  }
}

// DALWrapper

public DALWrapper implements DALInterface
{
   private ProdDAL dal;

   public DALWrapper(ProdDAL prodDAL)
   {
      this.dal = prodDal;
   }

... rest of interface goes here
}