【发布时间】:2016-11-02 13:40:09
【问题描述】:
我将使用 Arquillian 框架在 IBM WAS 8.5.5 上测试我的 ear 应用程序。我设法部署、启动并向我的耳朵应用程序发送 JMS 消息,并且耳朵已按计划处理此消息。根据我们的业务逻辑,每个 ear 都为其内部 EJB 组件之一实现 IBM 自动启动行为(比如它是无状态会话 Bean),因此组件的 ejb-jar.xml 如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<ejb-jar version="3.1" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_1.xsd">
<enterprise-beans>
<session>
<ejb-name>MyBusinessEjb</ejb-name>
<home>com.ibm.websphere.startupservice.AppStartUpHome</home>
<remote>com.ibm.websphere.startupservice.AppStartUp</remote>
</session>
...
一些内部EJB的代码是:
@Stateless(name = "MyBusinessEjb")
@TransactionManagement(TransactionManagementType.CONTAINER)
public class MyBusinessEjbBean implements TimedObject {
public boolean start() {
... init some resources here
return true;
}
public void stop() {
... free resources here
}
...
但是可惜——Arquillian 不允许应用程序调用 start() 和 stop() 方法。当管理员从 IBM Console 运行应用程序时,它们会自动调用(不使用带注释的或部署描述符指定的拦截器,只是由 IBM WAS 调用)。 在我的测试 EJB 中(当我的 ear 应用程序已经部署时,它由 arquillian 加载)我可以查找 MyBusinessEjb:
public void tryToCallStart() throws NamingException {
InitialContext ic = new InitialContext();
Object beanObj = ic.lookup("java:global/ear-app-1.0.0/ejb-module/MyBusinessEjb");
AppStartUpHome beanHome = (AppStartUpHome) PortableRemoteObject.narrow(beanObj, AppStartUpHome.class);
但是 JNDI 只返回 AppStartUpHome 存根,而不是我可以调用 startup() 的 AppStartUp,以及以下内容:
beanHome.create().start();
当然只是创建并启动另一个 bean 实例,而不是我的 :(
那么如何在 Arquillian 测试运行之前或期间在我的 ear-app-1.0.0 中调用 MyBusinessEjb 上的 start() 方法?或者也许有人对如何调用 start() 有任何其他想法 - 使用 arquillian.xml 或 Maven pom.xml 执行我的测试?
【问题讨论】:
标签: unit-testing jakarta-ee websphere jboss-arquillian