【问题标题】:JUnit with Glassfish and JPA带有 Glassfish 和 JPA 的 JUnit
【发布时间】:2012-06-28 00:03:33
【问题描述】:

我有一个在 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 的配置。 谢谢, 安

【问题讨论】:

    标签: unit-testing jpa junit glassfish junit4


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2013-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-21
      • 2019-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多