1

我目前正在研究使用 JUnit 测试 EJB 3 服务的解决方案。(是的,我查看了 ejb3unit,但它对我不起作用。是的,我查看了使用 openEJB 进行容器集成测试,但也没有用......)

所以我的问题是解决@EJB 注释依赖项的方法是什么?我并不是说使用像 Weld、Guice 或 Spring 这样的 DI 框架。该解决方案应该适用于普通的旧 JUnit 测试 -> 不使用 JBoss、Glassfish 或 openEJB 等 EJB 容器。

我能够通过@PersistenceContext 替换实体管理器的注入,并使用java 反射进行一些修改。那么我将如何使用 @EJB 注释对依赖项执行此操作?

(我不介意自己构建和解决依赖树,只是在寻找想法;))

来自德国的问候,ps

4

3 回答 3

2

不知道你为什么反对你提出的解决方案。
我正要提供像Arquillian这样的东西,但是,嘿 - 你不想涉及容器。
我只是想确定您不想要容器的原因,然后再继续讨论一些想法(尽管我没有测试它们) -
使用 JBoss AS 7.x,企业应用程序服务器的部署时间大大减少,而
不是提到 Arquillian,你有一个部署 API,你可以决定你将部署什么(即——例如,为给定的测试部署一个 bean)。
但是,我确实尊重你的问题,所以这里有一些想法 -
A. 你提到你设法使用反射注入了一个 EntityManager - 你是怎么做到的?
为什么不对你的豆子应用同样的方法?

B. 如果你遇到 A 的问题,为什么不开发你自己的注入代码,例如基于cglib(为了创建代理不仅用于接口,还用于类)。
这样,当创建类的对象时,
您将能够拦截默认 CTOR,
并扫描带有 @Ejb 注释的字段。
我建议使用某种配置文件来映射每个 bean 接口如何实例化适当的类,并递归地运行此流程(因为注入的 bean 可能也有一个带有 @EJB 注释的字段)。

请注意,如果您决定使用这种工作方法,您将实现某种“迷你依赖注入框架” - 除了我个人有兴趣查看您的代码(:))我认为您应该仔细想想为什么你不想使用“已经制定的解决方案”。

于 2012-08-31T08:34:56.340 回答
1

请注意关于 Arquillian 的建议,这仍然需要 EJB 容器,如 JBoss、GlassFish 或 OpenEJB。

如果问题只是查找并包含所有依赖项,请尝试使用这个包含 EJB Lite 所需的所有依赖项的 jar:

http://repo1.maven.org/maven2/org/apache/openejb/openejb-lite/4.0.0/openejb-lite-4.0.0.jar

将其包含在您的测试类路径中(不需要其他 jars),然后启动嵌入式容器:

EJBContainer container = EJBContainer.createEJBContainer();
MyBean bean = (MyBean) container.getContext().lookup("java:global/myModleName/MyBean");

这里的工作示例

于 2012-08-31T17:29:29.853 回答
0

你看过阿奎利安吗?您可以在项目页面上找到所有文档:http ://www.jboss.org/arquillian.html

于 2012-08-31T08:26:45.003 回答