1

我有一个在 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 ]

它似乎要求我无法提供的 transaction-type="RESOURCE_LOCAL",因为它与 Glassfish 的 transaction-type="JTA" 冲突。

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

4

1 回答 1

1

对于真正的容器内测试,您应该看看Arquillian。它允许您在容器内运行单元测试。

您应该查看http://arquillian.org/guides/上的文档和 GitHub 上的展示https://github.com/arquillian/arquillian-showcase/。还有一个 JSF 相关的展示。

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

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

  • 使用 .创建第二个 JPA 配置transaction-type="RESOURCE_LOCAL"
  • 将实体管理器的设置器添加到您的 bean。
  • 在您的测试设置中创建实体管理器,就像在独立的 Java 应用程序中一样。
  • 在 bean 中手动注入实体管理器。
  • 尝试使用像Mockito这样的模拟框架来模拟应用程序的所有其他部分,这些部分不是当前测试的一部分,而是测试所需的。

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

于 2012-06-27T07:41:57.307 回答