Java 为测试或生产获取EntityManger的最佳实践

Java 为测试或生产获取EntityManger的最佳实践,java,unit-testing,jpa,Java,Unit Testing,Jpa,我正在创建一个基于JPA的应用程序,我需要在许多不同的地方使用EntityManger。因此,我创建了一个返回实体管理器的单例类: class MyDB { static EntityManger getEM() { ... } } 我想将其用于测试和生产环境。对于测试,我想添加一个方法setteStenEnvironment(),确保使用测试数据库。(必须在第一次调用getEM()之前调用) 选择生产数据库或测试数据库的最佳方法是什么。我可以在persiste

我正在创建一个基于JPA的应用程序,我需要在许多不同的地方使用EntityManger。因此,我创建了一个返回实体管理器的单例类:

class MyDB {
    static EntityManger getEM() {
        ...
    }
}
我想将其用于测试和生产环境。对于测试,我想添加一个方法setteStenEnvironment(),确保使用测试数据库。(必须在第一次调用getEM()之前调用)


选择生产数据库或测试数据库的最佳方法是什么。我可以在persistence.xml中添加多个持久性单元吗?还有哪些替代方案?

我们使用Spring,它通过注释@PersistenceContext使事情变得非常简单,注释@PersistenceContext可以选择与persistence.xml中的持久性单元相同,还提供了类似JUnit的优秀测试框架

@PersistenceContext
public EntityManager entityManager;

众所周知,单例测试非常困难(必须添加setForTest()和resetForTest()之类的东西),也称为单例测试。投入时间使用IoC容器(spring或google guice)可以使重构、测试和扩展代码变得更加容易。

如果您运行在应用程序服务器中,甚至是像Tomcat这样的servlet容器中,只需通过容器处理连接细节即可


在Tomcat中,您可以在web应用程序的上下文XML文件中指定它,并在持久性XML中使用资源的完整JNDI名称。

最后,如我的初始问题所示,我创建了一个单独的(单例)类,可以首先调用该类来设置正确的数据库:

public static void setEnvironment(ApplicationEnvironment env) {
    environment = env;
}

public enum ApplicationEnvironment {
    UNKNOWN, PRODUCTION, TEST, DEVELOPMENT
}
根据设置的环境,选择正确的持久化单元:

    Persistence.createEntityManagerFactory(getEMFactoryParameter());
    ...

    public String getEMFactoryParameter() {

      if(environment == ApplicationEnvironment.DEVELOPMENT) {
        return "mydb_dev";
      } else if(environment == ApplicationEnvironment.TEST) {
        return "mydb_test";
      } else {
        return "mydb_prod";
      }
    }
我还没有使用tomcat,我仍然没有Web应用程序的外部。我的目的是在tomcat应用程序准备好投入生产时使用它。