Unit testing JUnit配Glassfish和JPA

Unit testing JUnit配Glassfish和JPA,unit-testing,jpa,junit,glassfish,junit4,Unit Testing,Jpa,Junit,Glassfish,Junit4,我有一个在Glassfish v3中运行的web应用程序。它是用JSF v2和JPA实现的(因此有一个persistence.xml,其中声明为JTA数据源) 如果我尝试使用JUnit测试我的存储库,它会导致查找失败,并导致以下错误: javax.naming.NamingException: Lookup failed for 'java:comp/env/persistence/em' in SerialContext[myEnv= java.naming.factory.initial=c

我有一个在Glassfish v3中运行的web应用程序。它是用JSF v2和JPA实现的(因此有一个persistence.xml,其中声明为JTA数据源)

如果我尝试使用JUnit测试我的存储库,它会导致查找失败,并导致以下错误:

javax.naming.NamingException: Lookup failed for 'java:comp/env/persistence/em' in SerialContext[myEnv=
java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory,
java.naming.factory.url.pkgs=com.sun.enterprise.naming, 
java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl} 
[Root exception is javax.naming.NamingException: Invocation exception: Got null ComponentInvocation ]
它似乎要求事务类型=“RESOURCE\u LOCAL”,但我无法提供,因为它与Glassfish的事务类型=“JTA”冲突

因此,我想问的是,是否有可能找到一种方法来运行JUnit,而无需[强烈]更改我的webapp的配置。 谢谢
一个

用于容器内的真实测试,您应该看看。它允许您在容器中运行单元测试

您应该查看位于的文档和GitHub的展示。还有一个与JSF相关的展示

关于您的配置。我强烈建议您以这样一种方式配置项目,即您可以在生产中使用不同的配置

如果您的测试只需要一个工作的JPA环境,那么您应该执行以下操作:

  • 使用
    事务类型=“RESOURCE\u LOCAL”
    创建第二个JPA配置
  • 将实体管理器的setter添加到bean中
  • 在测试设置中创建实体管理器,就像在独立Java应用程序中一样
  • 在bean中手动注入实体管理器
  • 尝试使用模拟框架来模拟应用程序的所有其他部分,这些部分不是当前测试的一部分,但测试需要

第二种方法取决于您的体系结构及其提供给您的可能性。它允许您编写非常细粒度的单元测试。第一种方法对于在容器中测试应用程序的真实行为非常有用。

对于容器中的真实测试,您应该看一看。它允许您在容器中运行单元测试

您应该查看位于的文档和GitHub的展示。还有一个与JSF相关的展示

关于您的配置。我强烈建议您以这样一种方式配置项目,即您可以在生产中使用不同的配置

如果您的测试只需要一个工作的JPA环境,那么您应该执行以下操作:

  • 使用
    事务类型=“RESOURCE\u LOCAL”
    创建第二个JPA配置
  • 将实体管理器的setter添加到bean中
  • 在测试设置中创建实体管理器,就像在独立Java应用程序中一样
  • 在bean中手动注入实体管理器
  • 尝试使用模拟框架来模拟应用程序的所有其他部分,这些部分不是当前测试的一部分,但测试需要
第二种方法取决于您的体系结构及其提供给您的可能性。它允许您编写非常细粒度的单元测试。第一种方法对于测试容器中应用程序的真实行为非常有用