如何解决Weld-Junit 中 TimerService 的处理
我正在尝试为使用 TimerService 的 JavaEE Bean 设置 Weld-JUnit4 测试。该应用程序在 Wildfly 应用程序服务器中运行,因此 TimerService 通过 @Resource
Annotation 注入到 bean 中。
在 Weld-JUnit 中,我必须通过以下方式绑定资源:WeldInitiator.from(<Some class).bindResource(nameOfRessource,<TimerServiceMock>)
但这行不通。模拟不会被注入。
所以我在 JEE Bean 中尝试了 @Resouce(name = "myTimer")
。这也行不通。
所以我在 JEE Bean 中尝试了 @Resouce(lookup = "myTimer")
。这适用于我的测试用例。但是在 ProductionCode 中,这将改变查找行为。所以这不是有效的解决方案。
如何在 WeldJunitTest 中模拟 TimerService? java.ejb.TimerService 是否有任何类型的默认查找?
感谢您的帮助。
解决方法
EJB 规范状态
16.14 TimerService 引用
除了通过 EJBContext 接口外,容器还必须通过使用 Resource 注释的注入或在名称 java:comp/TimerService 下的 JNDI 中使 TimerService 接口可用。不得指定 Resource 注解的 authenticationType 和 shareable 元素。
因此,如果您将该名称与查找属性一起使用,它应该可以工作。
或者:
16.2.2 环境条目的注释
[...]
- bean 类的一个字段可能是注入的目标。该字段不能是最终的。默认情况下,字段的名称与使用注解的类的名称组合在一起,并直接用作 bean 命名上下文中的名称。例如,包 com.acme.example 中 MySessionBean 类中名为 myDatabase 的字段将对应于 JNDI 名称 java:comp/env/com.acme.example.MySessionBean/myDatabase 。注释还允许显式指定 JNDI 名称。
所以也可以绑定字段名称对应的JNDI-name。它可以让您在 EJB 本身中获得更少的开销,但代价是每次重命名字段时都会破坏测试。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。