我对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
?答案 0 :(得分:1)
您可以使用@ javax.ejb.LocalBean
注释BusinessLogicBean@Stateless
@LocalBean
@Remote(BusinessLogic.class)
public class BusinessLogicBean implements BusinessLogic {
...
}
并按类名注入:
@EJB BusinessLogicBean businessLogicBean;
另见: