如果未在实现业务逻辑的接口中声明,则如何调用无状态bean方法

时间:2016-05-03 12:37:17

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

我对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

1 个答案:

答案 0 :(得分:1)

您可以使用@ javax.ejb.LocalBean

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

并按类名注入:

@EJB BusinessLogicBean businessLogicBean;

另见: