2

我有几个@Stateful像这样注释的 SessionBean:

@Stateful
@Remote(AdminFacade.class)
public class TAdminFacadeBean implements TgAdminFacade,Serializable
{
   ...
}

现在我想用 Arquillian (1.0.0.Alpha5) 测试它们,但是得到很多不同的错误,如果注释是@Stateful@Stateless,如果@Named添加了 a 或者没有 @Remote (和implements接口),消息会有所不同。

重现步骤:

  • 使用原型 org.jboss.weld.archetypes:jboss-javaee6-webapp:1.0.1.CR2 创建新的 maven 项目
  • 您可能需要设置 jboss.home(参见 readme.txt)
  • 修改 pom.xml 并将 profiles.profile[id=default].build.plugins.plugin[artifactId=maven-surefire-plugin].configuration.skip 设置为 false
  • 启动 JBoss-6.0.0.Final
  • 执行测试(应该通过):mvn test -Parq-jbossas-remote

这里测试的 bean ist MemberRegistration

@Model
public class MemberRegistration
{
   ...
}

如果您现在更改@Model@Stateful,JBoss 将使用堆栈跟踪进行循环,并@Named @Stateful出现以下错误:

java.lang.IllegalArgumentException: ArquillianServletRunner not found.
Could not determine ContextRoot from ProtocolMetadata, please contact
DeployableContainer developer.

@Named @Stateless

javax.transaction.NotSupportedException: BaseTransaction.checkTransactionState
- ARJUNA-16051 thread is already associated with a transaction!

如何@Stateful使用 Arquillian 测试我的 Bean?

4

1 回答 1

4

一遍又一遍地解决这个问题,我找到了解决方案。即使我讨厌回答我自己的问题,我希望这可以帮助将来的人。

会话 bean的注释@Stateful(在问题的顶部)是正确的并且保持不变。在 Arquillian 测试用例中,bean 最初被注入

@Inject MemberRegistration memberRegistration;

这适用于@Modelbean,但不适用于@Stateful会话 bean 和@Remote接口。看来这种豆子必须注入

@EJB private AdminFacade adminBean;

看看@Inject 和@EJB 有什么区别

于 2011-06-23T09:08:43.720 回答