【问题标题】:How to invoke a stateless bean method if it is not declared in interface implementing the business logic如果没有在实现业务逻辑的接口中声明,如何调用无状态 bean 方法
【发布时间】:2016-08-28 12:18:35
【问题描述】:

我在 EJB,尤其是 EJB 3.0 方面没有那么丰富的经验,因此,我遇到了一个我想解决的问题。我发现了一个类似的问题 here,但建议的解决方案没有帮助。

我有一个远程无状态 EJB,其业务方法在接口中声明,实现这些方法的 bean 还有其他未在接口中声明的方法。

这里以业务接口为例:

public interface BusinessLogic {
    Object create();
    void delete(Object x);
}

一个实现业务逻辑的BusinessLogicBean

@Stateless
@Remote(BusinessLogic.class)
public class BusinessLogicBean implements BusinessLogic {

    /** implemented method */
    public Object create() {
        Object x = new SomeDBMappedObject();
        // create an object in DB and return wrapper class
        ...
        return x;
    }

    /** implemented method */
    public void delete(Object x) {
        // deleting object from DB
        ...
    }

    /** The method that performs some extra logic */
    public void aMethod() {
        // do extra logic
    }
}

我需要使用 Arquillian 框架为该 EJB 编写单元测试,包括未在业务接口中声明的 bean 方法。

例子:

@RunWith(Arquillian.class)
public class BusinessLogicTest {

    /** will be injected during the test run */
    @EJB
    private BusinessLogic businessLogic;

    @Deployment
    public static Archive createDeployment() {
        WebArchive war = ShrinkWrap.create(WebArchive.class, "test.war")
                // add needed libraries and classes
                .addAsWebInfResource(EmptyAsset.INSTANCE, "beans.xml");

        return war;
    }

    @Test
    public void aMethodTest() {
        businessLogic.aMethod();

        // Write appropriate assertions
    }
}

我的问题是:

  • 如何在我的测试中调用aMethod()? 我不能像businessLogic.aMethod(); 那样称呼它,因为它会导致编译错误。 我不能像((BusinessLogicBean) businessLogic).aMethod(); 那样称呼它,因为它会导致ClassCastException,因为实际对象是com.sun.proxy.$ProxyXXX 类型。 或
  • 有没有办法直接注入BusinessLogicBean对象而不是BusinessLogic

【问题讨论】:

  • 我认为您在这里混合了两种类型的测试:一方面您有集成测试,您可以在其中测试,例如,远程调用您的BusinessLogiccreatedelete 方法;另一方面,您有单一测试,您可以在其中单独测试一段源代码,例如,您的业务逻辑实现:BusinessLogicBean。因此,您可以继续使用 Arquillian 进行集成测试,但您应该为 BusinessLogicBean 的单一测试创建一个仅使用 JUnit 的测试用例。
  • 亲爱的@aribeiro,如果我想测试的方法只是内部业务逻辑,我会同意你的看法。该功能影响了我的 EJB 中的太多东西,因此它的测试需要包含在集成测试中。你可能会问:那为什么不包含在业务接口中呢?但这是因为它已经是这样写的(在我开始工作之前),我不想改变它。无论如何,感谢您的评论和兴趣。
  • 不客气。 :) 好吧,既然您已经在部署中添加了 beans.xml,您可以随时尝试在测试中使用 CDI 和 @Inject 您的 BusinessLogicBean

标签: java unit-testing jakarta-ee ejb jboss-arquillian


【解决方案1】:

您可以使用 @javax.ejb.LocalBean 注释 BusinessLogicBean

@Stateless
@LocalBean
@Remote(BusinessLogic.class)
public class BusinessLogicBean implements BusinessLogic {
...
}

并通过其类名注入它:

@EJB BusinessLogicBean businessLogicBean;

另见:

【讨论】:

  • 感谢您的回答以及提供的链接。
猜你喜欢
  • 1970-01-01
  • 2013-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-16
  • 2013-09-23
  • 1970-01-01
相关资源
最近更新 更多