获取测试或生产的EntityManager的最佳实践

时间:2011-02-14 07:34:14

标签: java unit-testing jpa

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

class MyDB {
    static EntityManger getEM() {
        ...
    }
}

我想将它用于测试和生产环境。为了测试,我想添加一个方法setTestEnvironment(),以确保使用TEST数据库。 (这必须在第一次getEM()调用之前调用。)

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

3 个答案:

答案 0 :(得分:1)

我们使用Spring,它通过注释@PersistenceContext使事情变得非常简单,它可以选择性地使用persistence.xml中的持久性单元,并提供不错的测试框架,如JUnit。

@PersistenceContext
public EntityManager entityManager;

Singletons很难测试(你必须添加像setForTest()和resetForTest()这样的东西,也称为 singletonitus 。投入时间来使用IoC容器(spring或google guice)可以使重构,测试和扩展代码变得更加容易。

答案 1 :(得分:1)

如果您在应用程序服务器中运行 - 或者甚至是诸如Tomcat之类的servlet容器 - 您只需通过容器处理连接详细信息即可。

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

答案 2 :(得分:0)

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

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";
      }
    }