Java EE 6-嵌入式容器EJB测试
-
30-09-2019 - |
题
这个问题是关于 Java EE 6, , 使用 玻璃鱼V3嵌入式所有.
我有一个单位测试,该测试使用EJBContainer测试我的无状态EJB。问题是我使用jndi遇到了查找EJB(遥控器)的困难:
setup() {
ctx = EJBContainer.createEJBContainer().getContext();
}
...
test() {
BookService bookService = (BookService)ctx.lookup("java:global/BookServiceEJB!com.something.service.BookService");
...
}
@Stateless
public class BookServiceEJB implements BookService {
...
}
@Remote
public interface BookService {
...
}
给出例外:
javax.naming.NamingException: Lookup failed for 'java:global/BookServiceEJB!com.something.service.BookService' in SerialContext [Root exception is javax.naming.NameNotFoundException: BookServiceEJB!com.something.service.BookService not found]
...
caused by: javax.naming.NameNotFoundException: BookServiceEJB!com.something.service.BookService not found
我尝试了几个JNDI资源路径:
例如
java:global/BookServiceEJB
java:global/BookService
甚至:
java:global/BookShelf-1.0-SNAPSHOT/BookServiceEJB
ETC...
没有工作
一世 没有任何XML部署 配置的文件,仅 persistence.xml
在meta-inf中。
该测试正在使用Maven Surefire:
mvn clean test
任何帮助是极大的赞赏!
笔记: :完整部署到Glassfish Server(使用AppClient,以及 @EJB
注射)
解决方案
经过大量的搜索,找到了对我有用的解决方案...
您必须将EJBContainer配置为属性:ejbcontainer.modules,以及模块类所在的位置(如果使用maven,“ target/class”)。
例如
...
props = new Properties();
props.put(EJBContainer.MODULES, new File("target/classes"));
ec = EJBContainer.createEJBContainer(props);
...
如果您的EJB使用JPA,则存在另一个问题,因为您将无法在嵌入式容器中定义数据源,因此必须使用默认的DS:“ JDBC/__ default”。
因此,例如我的persistence.xml看起来像:
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
version="1.0">
<persistence-unit name="bookshelf" transaction-type="JTA">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<class>com.blah.domain.Book</class>
<jta-data-source>jdbc/__default</jta-data-source>
<properties>
<property name="eclipselink.logging.level" value="INFO"/>
</properties>
</persistence-unit>
</persistence>
我还没有想出如何配置嵌入式容器测试以使用一个DS(JDBC/__默认值),以及我的应用程序使用另一个DS(例如JDBC/BooksD)
看: http://www.mentby.com/glassfish/embedded-testing-woes.html
看: http://forums.java.net/jive/thread.jspa?messageid=395759
老实说,我不知道为什么当像春季这样的解决方案更简单时,人们为什么要打扰Java EE ...
这是非常令人沮丧和大量浪费的……希望这会有所帮助。
其他提示
您需要检查一些项目,以确保可以通过 context.lookup 避免 NamingException.
确保您有豆子。这听起来可能很明显,但是我花了很多时间试图弄清楚为什么我无法在测试中获得服务实例。原因是我错过了 无状态 注解。
如@dzhu指出时,在创建容器时添加模块。为了小牛 课程 将会 目标/课程, ,对于小牛 测试 将会 目标/测试类.
如果您找到类似的消息,有什么问题
SEVERE: EJB6005:No EJB modules found
在控制台。它告诉你没有 无状态 注释的课程看看嵌入式玻璃鱼游戏机!在那里,您会看到豆的查找名称。注意格式的消息
INFO: EJB5181:Portable JNDI names for EJB YourBean: [java:global/classes/YourBean!bean.package.YourBean, java:global/classes/YourBean]
. 。这意味着您可以通过致电查找豆context.lookup("java:global/classes/YourBean!bean.package.YourBean")
或以较短的名字context.lookup("java:global/classes/YourBean")
如果没有名称碰撞,这将很有用。
希望这对某人有帮助。有了这些技巧,这真的很有帮助。
我写了一个有关使用嵌入式玻璃鱼3.1容器的小教程,还解决了需要不同持久性的问题。xml进行测试。还可以将容器崩溃使用远程接口和网站服务。您可以在 http://pschyska.blogspot.com/2011/06/unit-testing-ejb-31-with-netbeans-maven.html